Java基础-对象的引用类型

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2020-12-09 07:21 被阅读0次

上一篇 <<<JVM中对象如何完成空间分配和初始化工作
下一篇 >>>JVM元空间(方法区)和栈内存溢出原因及解决方案


强引用

Object o = new Object(); 被引用关联的对象永远不会被垃圾收集器回收。

QuoteEntity user1 = new QuoteEntity("jarye");
QuoteEntity user2 = user1;
user1 = null;
System.out.println(user2);
System.gc();
System.out.println(user2);
---------------------------------------------------------------
打印结果:
com.jarye.quote.entity.QuoteEntity@2f410acf
com.jarye.quote.entity.QuoteEntity@2f410acf

软引用

SoftReference 软引用关联的对象,只有当系统内存溢出时,才会回收软引用的对象。(用来做缓存)

ArrayList<SoftReference<byte[]>> objects = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    SoftReference<byte[]> softReference = new SoftReference<>(new byte[4 * 1024 * 1024]);
    System.out.println("======="+softReference.get());
    objects.add(softReference);
}
System.out.println("打印结果:");
objects.forEach((t) -> {
    System.out.println("-------------"+t.get());
});

参数设置:-Xmx8m -XX:+PrintGCDetails -verbose:gc
响应结果:
=======[B@768debd
=======[B@490d6c15
=======[B@7d4793a8
=======[B@449b2d27
=======[B@5479e3f
=======[B@27082746
=======[B@66133adc
=======[B@7bfcd12c
=======[B@42f30e0a
=======[B@24273305
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------null
-------------[B@24273305
tips:虚拟机设置了8M,由于其他也占用空间,所以最后只存了一个

弱引用

WearkReference 只能存在于下一次gc之前:发生minorgc majorgc就会被回收

QuoteEntity user1 = new QuoteEntity("jarye");
WeakReference<QuoteEntity> weakReference = new WeakReference<QuoteEntity>(user1);
user1 = null;
System.out.println(weakReference.get());
System.gc();
System.out.println(weakReference.get());
---------------------------------------------------------------
打印结果:
com.jarye.quote.entity.QuoteEntity@2f410acf
null

虚引用

Object o = new Object();
O=null; 提醒我们的gc来回收这个对象
tips:基本上没用,必须要PhantomReference修饰,结果随时可能为空

QuoteEntity user1 = new QuoteEntity("jarye");
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();
PhantomReference<QuoteEntity> phantomReference = new PhantomReference<QuoteEntity>(user1, referenceQueue);
System.out.println(phantomReference.get());
---------------------------------------------------------------
null

tips:软弱虚对应引用的指针放入到引用队列中,实现清理。


相关文章链接:
<<<Java基础-反射机制
<<<Java基础-字节码技术
<<<Java基础-创建对象的方式汇总
<<<Java基础-对象布局
<<<Class文件分析一个类为啥最多支持65535个接口
<<<为什么重写equals还要重写hashcode方法
<<<如何自定义注解
<<<十大经典排序算法汇总-动画演示
<<<JDK8十大新特性

相关文章

  • java深入理解浅拷贝和深拷贝

    简介 拷贝对象是java中经常会遇到的问题。java中存在两种类型,基础类型和引用类型。 java的赋值都是传值的...

  • Java基础-对象的引用类型

    上一篇 <<

  • 如何查看java对象大小及其地址

    解密java对象的地址及大小: 一个对象的大小等于:对象头+属性占用空间(基础类型+引用类型 8Byte)关闭指针...

  • java调用方法传递机制

    java是传值,不是传引用,有人说有的人说:基础类型传值,对象类型传引用。其实对象类也是传值,只不过对象的值恰好是...

  • Java值传递和引用传递

    Java中无论基础数据类型还是引用变量,Java参数传递都是值复制的传递过程.对于引用变量,复制指向对象的首地址

  • Java对象生命周期和类生命周期

    导读 移动开发知识体系总章(Java基础、Android、Flutter) Java四大引用类型 对象的生命周期 ...

  • Java核心知识点(二)

    Java面向对象基本概念——引用 Java语言中除基本类型之外的变量类型都称之为引用类型 Java中的对象是通过引...

  • @proterty属性分类

    Strong 强引用,对象的引用计数器值+1 Assign 弱引用,对象的引用计数器值不变,用于基础类型(基础类型...

  • 13.包装类

    1.什么是包装类? java 提供了两种类型,基础类型和引用类型。使用基础类型在于效率。然而当要使用针对于对象设计...

  • java的String值传递还是引用传递

    java值传递还是引用传递 一般可以这样认为基础类型是值传递,而对象封装是引用传递 对于test。传入对象,以后都...

网友评论

    本文标题:Java基础-对象的引用类型

    本文链接:https://www.haomeiwen.com/subject/zbegwktx.html