欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > Java-关于Java的四种引用类型的理解

Java-关于Java的四种引用类型的理解

2024/10/23 23:21:14 来源:https://blog.csdn.net/weixin_43834477/article/details/143036374  浏览:    关键词:Java-关于Java的四种引用类型的理解

java 中的四种引用类型:强引用、软引用、弱引用、虚引用
强引用
A a = new A();
a = null;
这种引用就是强引用,只要a还指向A对象,哪怕内存不足(引用计数法,只要有引用指向就不是垃圾),JVM也会抛出oom而不会去回收。如果想中断强引用与对象之间的关系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了。
软引用
在内存足够的时候,不会回收,当内存不够的时候会回收软引用,如果此时还是不够就会抛出oom。
可以手动通知GC回收:System.gc();—>只是通知GC,但是具体回不回收何时回收还是GC决定。
弱引用
弱引用比软引用要更低一级,当垃圾回收开始时,不管内存是否足够都会将弱引用进行回收。
ThreadLocalMap中的Entry就继承了WeakReference<ThreadLocal<?>>,我们一般在使用ThreadLocal时:ThreadLocal userInfo = new ThreadLocal;在使用完成后虽然可以显示userInfo = null来断开强引用,此时ThreadLocal只剩下map->Entry->key这一个弱引用,就会被GC回收,但是其中的User的强引用还在CurrentThread中,而且永远访问不到了,只有当前线程结束才会结束。但是如果是线程池,那么该线程就会一直在线程池中等待下一个线程,这个线程中的map没有删除(User作为value就存储在map中),会造成oom。
所以一般建议使用userInfo.remove();
虚引用
虚引用是最低一级的,一般来说这个引用形同虚设,必须配合引用队列(ReferenceQueue)使用。当垃圾回收器在回收一个对象时,如果这个对象还有引用,那么就会将这个引用放入到与之关联的引用队列中。程序可以通过判断引用队列汇总是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收。这样可以在回收前采取一些必要措施。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com