java中的4种引用类型简单了解
发布日期:2021-06-30 21:07:22
浏览次数:3
分类:技术文章
本文共 3179 字,大约阅读时间需要 10 分钟。
1.有关知识点英文
强引用 Strong reference
软引用 SoftReference弱引用 WeakReference虚引用(幽灵引用) PhantomReference引用队列 ReferenceQueue
2.分析如下:
public class Z { public static void main(String[] args) { //强引用:创建一个对象,并把这个对象赋给一个变量,那么该变量持有对该对象实例的强引用 //只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象 //如果想中断强引用和某个对象之间的关联,可以将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象 /*new Z().fun1(); System.gc();*/ /*new Z().fun2();*/ //软引用:内存不足,则回收,足则不回收,常用于高速缓存,图片缓存,网页缓存。。。 /*new Z().fun3();*/ /*new Z().fun4();*/ //弱引用:只要gc回收,就会被回收 //弱引用能用来在回调函数中防止内存泄露, //因为回调函数往往是匿名内部类,隐式保存有对外部类的引用, //所以如果回调函数是在另一个线程里面被回调,而这时如果需要回收外部类, //那么就会内存泄露,因为匿名内部类保存有对外部类的强引用 /*new Z().fun5();*/ //虚引用:垃圾回收时回收,无法通过引用取到对象值。不影响对象的生命周期 //必须和引用队列关联使用 new Z().fun6(); } //以下函数每次只在main函数里用一个进行测试 public void fun1() { Object[] object = new Object[1000000000]; System.gc(); //gc回收 }//打印如下:即使抛出OutOfMemoryError异常,也不回收. //Exception in thread "main" java.lang.OutOfMemoryError: Java heap space //at com.example.liuyan.myapplication.Test.fun1(Test.java:17) //at com.example.liuyan.myapplication.Test.main(Test.java:10) public void fun2() { String string = "abc"; System.gc(); //string = null; 加上这句就会打印出null,证明中断了强引用 System.out.println(string); }//可以看到,即使用了回收依然会打印abc public void fun3() { String string = new String("abc"); SoftReferencesf = new SoftReference (string); string = null; //结束掉obj的强引用,不然sf会与强引用关联,在内存不足的时候也不能回收 System.out.println("sf1 " + sf.get()); System.out.println("string " + string); System.gc(); //有时候(内存不足时)sf.get()会返回null System.out.println("sf2 " + sf.get()); } //这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null //这里因为内存足够所以软引用有,sf没被回收.如果内存不足,则会被回收sf.get()为null //打印如下://sf1 abc //string null //sf2 abc public void fun4() { String[] strings = new String[44624270]; for (int i = 0; i < strings.length; i++) { strings[i] = "abcdefghijklmnopqrstuvwxyz"; } SoftReference sf = new SoftReference (strings); strings = null; System.out.println("sf1 " + sf.get()); System.out.println("string " + strings); System.gc(); //有时候(内存不足时)sf.get()会返回null System.out.println("sf2 " + sf.get()); } //这里因为内存不足,所以gc回收后,sf.get()为null public void fun5() { WeakReference sr = new WeakReference (new String("abc")); System.out.println(sr.get()); System.gc(); //通知JVM的gc进行垃圾回收 System.out.println(sr.get()); //不管内存足不足,都会被回收了为null System.out.println(sr.isEnqueued());//返回是否被垃圾回收器标记为即将回收的垃圾 } //打印如下://abc //null //false public void fun6() { String string = new String("abc"); ReferenceQueue queue = new ReferenceQueue (); PhantomReference pf = new PhantomReference (string, queue); string=null; System.out.println(pf.get()); //永远返回null System.out.println(pf.isEnqueued()); //返回是否从内存中已经删除 System.gc(); System.out.println(pf.get()); //永远返回null System.out.println(pf.isEnqueued()); //返回是否从内存中已经删除//打印如下:null false null true } }
3.补充如下:
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否被垃圾回收.
下图为引用资源图:
一句话概括,就是弱中选强,为被多个对象引用时的引用类型.
转载地址:https://liuyan.blog.csdn.net/article/details/79922135 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月29日 02时46分17秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python 函数式编程
2019-04-30
python编码
2019-04-30
redis cli
2019-04-30
redis api
2019-04-30
flink physical partition
2019-04-30
java 解析json
2019-04-30
java http请求
2019-04-30
tensorflow 数据格式
2019-04-30
tf rnn layer
2019-04-30
tf input layer
2019-04-30
tf model create
2019-04-30
tf dense layer两种创建方式的对比和numpy实现
2019-04-30
tf initializer
2019-04-30
tf 从RNN到BERT
2019-04-30
tf keras SimpleRNN源码解析
2019-04-30
tf keras Dense源码解析
2019-04-30
tf rnn输入输出的维度和权重的维度
2019-04-30
检验是否服从同一分布
2019-04-30
tf callbacks
2019-04-30
keras、tf、numpy实现logloss对比
2019-04-30