JVM 引用类型
程序员文章站
2022-06-22 12:05:01
是比强引用弱化的引用,可以让对象豁免一些垃圾回收,软引用通常在对内存比较敏感的程序中,例如高速缓存区,mybatis就是用到了该方式。他的特点就是 存充足的时候不被回收,内存不足时才被回收。 ......
1、强引用
强引用,是在我们的开发工作当中普遍存在的。如果一个对象具有强引用,那就类似我们经常穿的衣服啊等必不可少的生活用品,我们肯定不会把他扔掉,同样jvm的垃圾回收器也不会回收它。当内存空间不足的时候,java虚拟机宁可抛出oom异常,也不会回收具有强引用的对象来释放内存。我们可以将对象显示的赋值为null,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于gc的算法。也就是说方法的内部有一个强引用,这个引用保存在栈中,而真正的引用内容(object)保存在堆中。当这个方法运行完成后就会退出方法栈,则引用内容的引用不存在,这个object会被回收。
2、软引用
softreference:是比强引用弱化的引用,可以让对象豁免一些垃圾回收,软引用通常在对内存比较敏感的程序中,例如高速缓存区,mybatis就是用到了该方式。他的特点就是 存充足的时候不被回收,内存不足时才被回收。
package com.jalja.java.reference; import java.lang.ref.softreference; /** * @auther: xl * @date: 2019/12/24 07:50 * @description: */ public class softreferencetest { public static void main(string [] args) throws exception{ //softreferenceample(); softreferencenotample(); } /** * 内存充足 */ private static void softreferenceample(){ object o=new object(); softreference<object> reference=new softreference<>(o); system.out.println(o); system.out.println(reference.get()); o=null; system.gc(); system.out.println(o); system.out.println(reference.get()); } /** * 内存不足就回收 */ private static void softreferencenotample(){ object o=new object(); softreference<object> reference=new softreference<>(o); system.out.println(o); system.out.println(reference.get()); o=null; try { byte[]bytes=new byte[30*1024*1024]; }finally { system.out.println(o); system.out.println(reference.get()); } } }
3、弱引用
weakreference:无论内存是否足够,只要发生gc 弱引用的对象一定被回收
package com.jalja.java.reference; import java.lang.ref.softreference; import java.lang.ref.weakreference; import java.util.weakhashmap; /** * @auther: xl * @date: 2019/12/24 08:02 * @description: */ public class weakreferencetest { public static void main(string [] args) throws exception{ weakreferencetest(); } /** * 内存充足 */ private static void weakreferencetest(){ object o=new object(); weakreference<object> reference=new weakreference<>(o); system.out.println(o); system.out.println(reference.get()); o=null; system.gc(); system.out.println("==========gc========="); system.out.println(o); system.out.println(reference.get()); } private static void weakhashmaptest(){ weakhashmap<string,object> weakhashmap=new weakhashmap<>(); } }
weakhashmap:
4、虚引用
phantomreference:
public static void main(string [] args) throws exception{ object o=new object(); referencequeue<object> queue=new referencequeue(); phantomreference<object> reference=new phantomreference<>(o,queue); system.out.println(o); system.out.println(reference.get()); system.out.println(queue.poll()); o=null; system.gc(); system.out.println("==========gc========="); system.out.println(o); system.out.println(reference.get()); system.out.println(queue.poll()); }
引用队列:referencequeue
package com.jalja.java.reference; import java.lang.ref.referencequeue; import java.lang.ref.weakreference; /** * @auther: xl * @date: 2019/12/24 08:28 * @description: referencequeue 引用队列,在gc后悔保留对象的引用 */ public class referencequeuetest { public static void main(string [] args) throws exception{ object o=new object(); referencequeue<object> queue=new referencequeue(); weakreference<object> reference=new weakreference<>(o,queue); system.out.println(o); system.out.println(reference.get()); system.out.println(queue.poll()); o=null; system.gc(); system.out.println("==========gc========="); system.out.println(o); system.out.println(reference.get()); system.out.println(queue.poll()); } }
推荐阅读
-
js声明引入和变量声明和变量类型、变量
-
Android中 TeaScreenPopupWindow多类型筛选弹框功能的实例代码
-
对Python3中dict.keys()转换成list类型的方法详解
-
将string类型的数据类型转换为spark rdd时报错的解决方法
-
必须会的SQL语句(五) NULL数据处理和类型转换
-
JavaScript基本类型值-Undefined、Null、Boolean
-
python基础教程之基本数据类型和变量声明介绍
-
ASP.NET2.0服务器控件之类型转换器
-
.NET Core应用类型(Portable apps & Self-contained apps)
-
C#难点逐个击破(5):类的访问类型