强软弱虚引用

强引用

简介:

强引用 (Strong Reference)

特征:

只有手动赋值为 null 才会被垃圾回收线程回收

实验:

创建一个对象(对比两者输出):未置空,调用垃圾线程进行回收;置空,调用垃圾线程进行回收

结果:

当对象未置空,并没有输出垃圾回收时才会调用的方法;对象置空,并输出垃圾回收时才会调用的方法;

实验代码:
public class T01_M {

    /**
     * 线程机型垃圾回收时,会调用该方法
     * @throws Throwable
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("T01_M被垃圾回收线程,回收"+this);
    }
}

public class T01_StrongReference {
    public static void main(String[] args) {
        T01_M m = new T01_M();
        System.out.println("未置空对象,调用垃圾回收线程,回收");
        System.gc();
        System.out.println("置空对象,调用垃圾回收线程,回收");
        m = null;
        System.gc();
    }
}
实验结果:
image.png

软引用

简介:

软引用 (Soft Reference)

特征:

在堆内存不足时,系统则会回收软引用对象,
如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。

用途:

主要用于缓存上面

实验:

准备:(设置JVM启动参数:-Xmx20M; 使用JDK11,使用JDK8时,会OOM,暂不清楚原因)

  • 1.设置堆大小 20M,创建软引用对象占用10M;
  • 2.调用垃圾回收线程,输出软引用,发现并未回收掉软引用对象;
  • 3.创建bytes数组 占用 15M;堆最大 20M(剩余10M),正常情况下会发生OOM的情况;但是因为是软引用对象;当堆内存不够时,会自动回收软引用对象
  • 4.再次输出 软引用对象,发现为空,说明已经被垃圾回收线程回收
结果:

当正常分配对象堆内存时,发现堆内存不足以分配新空间时,会回收软引用对象

idea 启动配置
image.png
实验代码:
public class T02_SoftReference {
    public static void main(String[] args) {
        SoftReference<byte[]> m = new SoftReference<>(new byte[1024 * 1024 * 10]);
        System.out.println("垃圾回收前:"+m.get());
        System.gc();
        System.out.println("垃圾回收(堆内存足够):"+m.get());
        byte[] bytes = new byte[1024 * 1024 * 15];
        System.out.println("垃圾回收(堆内存不足):"+m.get());
    }
}
实验结果:
image.png

弱引用

简介:

软引用 (Weak Soft)

特征:

经历垃圾回收,弱引用对象必会被回收;一次性使用
JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。

用途:

ThreadLocal

实验:

创建弱引用对象,调用垃圾回收线程回收,观察弱引用对象是否被清理

结果:

弱引用对象京过垃圾回收线程之后,被回收

实验代码:
public class T03_WeakReference {

    public static void main(String[] args) {
        WeakReference<Object> m = new WeakReference<>(new Object());

        System.out.println(m.get());
        System.gc();
        System.out.println(m.get());
    }
}
实验结果:
image.png

虚引用

简介:

虚引用 (Phantom Reference)
虚引用必须和引用队列 (ReferenceQueue)联合使用
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中.
你可以通过判断queue里面是不是有对象来判断你的对象是不是要被回收了

实验代码:
public class T04_PhantomReference {
    private static final List<Object> LIST = new LinkedList<>();
    private static final ReferenceQueue<T04_M> QUEUE = new ReferenceQueue<>();

    public static void main(String[] args) {
        PhantomReference<T04_M> phantomReference = new PhantomReference<>(new T04_M(),QUEUE);

        new Thread(()->{
           while (true){
               LIST.add(new byte[1024*1024]);
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }
               System.out.println(phantomReference.get());
           }
        }).start();

        new Thread(()->{
            while (true){
                Reference<? extends T04_M> poll = QUEUE.poll();
                if(poll!=null){
                    System.out.println("======虚引用对象被JVM 回收了======"+poll);
                }
            }
        }).start();

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 前言 Google Play应用市场对于应用的targetSdkVersion有了更为严格的要求。从 2018 年...
    申国骏阅读 63,838评论 14 98
  • 《来,我们说说孤独》 1·他们都在写孤独 一个诗人 如果 不说说 内心的孤独 不将孤独 写进诗里 是不是很掉价呢 ...
    听太阳升起阅读 4,367评论 1 7
  • 自幼贫民窟长大的女子,侥幸多念了两本书,枉以为可以与人平起平坐。可是人生从来都是接力赛,我们却天真的当成了百米冲刺...
    Leeanran阅读 5,755评论 1 5
  • 云舒老师,姓甚名谁,男的女的,多大岁数,这些我全然不知。之所以要写写云舒老师,完全是因为他写的文章,如一个巨大的磁...
    数豆者m阅读 2,317评论 5 9
  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 2,832评论 0 5