原创

Java中强引用、软引用、弱引用、虚引用区别和应用分析

Java 中什么是强引用?

强引用是指把一个对象赋值给一个引用变量,这个引用变量就是一个强引用,Java中最常见的就是强引用。

当一个对象被强引用变量引用时,那么是不可能被垃圾回收机制回收的,因此强引用是造成Java内存泄漏的主要原因之一。

代码如下:

Object obj = new Object();

当内存空间不足时,Java虚拟机宁可抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

当强引用对象不使用时,需弱化从而使垃圾回收机制能够回收,如下:

obj = null;

当obj设置为null或超出对象的生命周期范围,此时GC会认为这个对象不存在引用,就可以回收这个对象。

Java 中什么是软引用?

软引用可用来实现内存敏感的高速缓存。

软引用需要使用SoftReference类来实现,对于只有软引用的对象来说,当系统内存足够时不会被垃圾回收器回收,但是系统内存空间不足时会被垃圾回收器回收。

软引用通常用来实现内存敏感的高速缓存。

String str = new String("abc");
SoftReference<String> softReference = new SoftReference<String>(str);

注意的是软引用对象是在JVM内存不不足时才会被回收,而调用System.gc()方法只是起到通知作用,具体JVM何时扫描回收对象是JVM状态决定的。

Java 中什么是弱引用?

弱引用需要使用WeakReference类来实现,相对比软引用的生命周期更短。

对于只有弱引用的对象来说,垃圾回收机制一运行,垃圾回收器线程扫描它所管辖的内存区域过程中,不管当前内存空间是否足够,都会回收它的内存。但是由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

String str = new String("abc");
WeakReference<String> weakReference = new WeakReference<>(str);
str = null;

注意的是如果一个对象是很少使用且希望在使用时随时就能获取到该对象,但又不想影响此对象的垃圾收集,那么建议使用Weak Reference来记住此对象。

Java 中什么是虚引用?

虚引用与其他几种引用都不同,虚引用不会决定对象的生命周期。如果一个对象仅有虚引用,那么就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

虚引用需要使用PhantomReference类来实现,不能单独使用必须和引用队列联合使用。虚引用的应用场景是跟踪对象被垃圾回收的状态。

String str = new String("abc");
ReferenceQueue queue = new ReferenceQueue();// 虚引用必须与一个引用队列关联
PhantomReference pr = new PhantomReference(str, queue);

JAVA 中有几种引用类型?引用类型有什么区别?

引用类型回收时间使用说明终止时间
强引用从来不会对象的一般状态JVM停止运行时终止
软引用当内存不足时对象缓存内存不足时终止
弱引用正常垃圾回收时对象缓存垃圾回收后终止
虚引用正常垃圾回收时跟踪对象的垃圾回收状态垃圾回收后终止

Java中有4种引用类型。

引用类型的级别和强度由高到低依次为:强引用->软引用->弱引用->虚引用。

~阅读全文~人机检测~

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信