搜索
java - 软引用回收的问题
PHP中文网
PHP中文网 2017-04-17 14:43:55
[Java讨论组]

使用软(弱)引用可以使得内存吃紧jvm进行garbage collection的时候回收掉 被软(弱)引用指向的对象,避免oom内存溢出.
使用如下:

WeakReference<Object> weakRef = WeakReference<Object>(new Object());

问题来了.
如果之后还有这么一句:

Object ref = weakRef;

那么,这个对象算不算是 被WeakReference引用?在ref 不被 改变指向的情况下,这个对象会不会被回收?

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
高洛峰

WeakReference是弱引用,SoftReference是软引用
ref是强引用,指向了weakRef,weakRef对象是强可达的,weakRef指向的对象无法通过强引用和软引用reach,所以还是弱可达的,会被回收。

关于可达性和回收时间
An object is weakly reachable if it is neither strongly nor softly
reachable but can be reached by traversing a weak reference. When the
weak references to a weakly-reachable object are cleared, the object
becomes eligible for finalization.

    public static void main(String[] args) {
        WeakReference<Object> wr = new WeakReference<Object>(new Object());
        int i=0;
        Object sr2 = wr;
        while(true){
            System.out.println(i);
            if(wr.get()!=null){
                i++;
                System.out.println("wr can reach "+wr.get());
            }else{
                System.out.println("null");
                break;
            }
            System.gc();
        }
    }

测试代码,wr在i=1时即被回收了

PHP中文网

要搞清楚一点,你的弱引用对象指向Object对象
然后你把Object对象的引用ref又指向了弱引用对象
只要一个对象只被软引用所引用,这个对象就不会活到下次垃圾收集发生后。
所以,回答你的两个问题:

  1. 这个对象是只被WeakReference对象所引用。

  2. 在这个WearReference对象引用不改变指向的情况下,Object对象会存活到下一次垃圾收集发生前。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号