Java基础-对象的引用类型
上一篇 <<<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十大新特性