RxJavaJava服务器端编程编程语言爱好者

Java基础-对象的引用类型

2020-12-09  本文已影响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十大新特性

上一篇下一篇

猜你喜欢

热点阅读