Java之强引用、弱引用、软引用和虚引用简介说明

java问题王 Java每日一问 发布时间:2021-10-22 11:49:31 阅读数:15815 1
下文笔者讲述java中强引用、弱引用、软引用和虚引用的简介说明,如下所示:
我们都知道Java中垃圾回收(GC回收),是借助判断对象是否存在存活
那么判断对象是否存活中,有一种方式就是引用计数
----------------------------------------------------------------
引用技术:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1
--------------------------------------------------------------------------------------------
根据对象的引用等级,将对象分为四个级别,分别为:强引用、软引用、弱引用和虚引用
下文将依次将四个级别的简介说明,如下所示:

强引用(StrongReference)

强引用是我们日常使用最多的引用
当一个对象具有强引用,则垃圾回收器绝不会回收它 例:
Object obj = new Object();
当内存空间不足时,Java虚拟机会抛出OutOfMemoryError错误,使程序异常终止
但是不会回收此对象

当强引用对象不使用时,我们需使用以下方式释放对象
obj = null;
显式的将对象设置为null,此时GC则会回收其信息
例:
public void test() {
   Object obj = new Object();
    //其它业务操作
}
 一个方法的内部有一个强引用,这个引用保存在Java栈中,而真正的引用内容(Object)保存在Java堆中。
当这个方法运行完成后,就会退出方法栈,此时引用对象的引用数为0
这个对象会被回收。

当这个strongReference是全局变量时,就需要在不用这个对象时赋值为null,因为强引用不会被垃圾回收。

软引用(SoftReference)

当一个对象只具有软引用
如果内存空间充足时,则垃圾回收器就不会回收它
如果内存空间不足了,就会回收这些对象的内存
例:
    // 强引用
    String strongReference = new String("java265.com");
    // 软引用
    String str = new String("java265.com");
    SoftReference<String> softReference = new SoftReference<String>(str);
注意事项:
    软引用对象是在jvm内存不够的时候才会被回收,
	当调用System.gc()方法只是起通知作用
     JVM什么时候扫描回收对象是JVM自己的状态决定的
     就算扫描到软引用对象也不一定会回收它
     只有内存不够的时候才会回收
----------------------------------------------------------
即:
垃圾收集线程会在虚拟机抛出OutOfMemoryError之前回收软引用对象
而且虚拟机会尽可能优先回收长时间闲置不用的软引用对象

弱引用(WeakReference)

弱引用与软引用的区别在于
只具有弱引用的对象拥有更短暂的生命周期
在垃圾回收器线程扫描它所管辖的内存区域的过程中
一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
    String str = new String("java265.com");
    WeakReference<String> weakReference = new WeakReference<>(str);
    str = null;
当一个对象是偶尔(很少)的使用
且希望在使用时随时就能获取到
但又不想影响此对象的垃圾收集
那么你应该用Weak Reference来记住此对象。

虚引用(PhantomReference)

与上面几种引用都不同,虚引用并不会决定对象的生命周期
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收
虚引用与软引用和弱引用的一个区别在于:
虚引用必须和引用队列(ReferenceQueue)联合使用
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,
就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中
    String str = new String("java265.com");
    ReferenceQueue queue = new ReferenceQueue();
    // 创建虚引用,要求必须与一个引用队列关联
    PhantomReference pr = new PhantomReference(str, queue);

以下讲述四种引用的区别:
引用类型 被垃圾回收时间 用途 生存时间
强引用 从来不会 对象的一般状态 JVM停止运行时终止
软引用 当内存不足时 对象缓存 内存不足时终止
弱引用 正常垃圾回收时 对象缓存 垃圾回收后终止
虚引用 正常垃圾回收时 跟踪对象的垃圾回收 垃圾回收后终止
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaProblem/202110/1534.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者