强引用、软引用、弱引用

在Java对象中,有 强、弱、软、虚 4种引用,它们都和垃圾回收流程密切相关。

在项目代码中我们可以合理地使用不同类型的引用来优化代码的内存使用性能。

 

强引用:通过 new关键字得到的内存空间的引用称为强引用。

如:String str = new String("sa123");其中 str 就是一个强引用,它指向了一块内容为"sa123"的堆空间。

 

软引用:如果一个对象只具有软引用,而当前虚拟机堆内存空间足够,那么垃圾回收期就不会回收它,反之如果堆内存空间不够就会回收这些软引用指向的对象。

 

弱引用:垃圾收回器一旦发现某块内存上只有弱引用(只有弱引用,没有强引用)时,不管当前内存空间是否足够,都会回收这块内存。

 

package org.onepiece;

import java.lang.ref.WeakReference;
import java.lang.ref.SoftReference;

public class Main {

    public static void main(String[] args) {

        String str = new String("sa123"); //强引用
        println(str); //sa123

        SoftReference<String> softRef = new SoftReference<>(str); //软引用
        println(softRef.get()); //sa123

        str = null; //去掉强引用

        println(softRef.get()); //sa123

        System.gc(); //启动垃圾回收
        println(softRef.get()); //sa123
    }

    private static void println(Object obj) {
        System.out.println(obj); //sout
    }
}

通过 System.gc();启动垃圾回收后,由于此时内存空间足够,垃圾回收器不会回收str变量的内存,因此输出结果是:sa123 。

 

package org.onepiece;

import java.lang.ref.WeakReference;
import java.lang.ref.SoftReference;

public class Main {

    public static void main(String[] args) {

        String abc = new String("abc"); //强引用
        println(abc); //abc

        WeakReference<String> weakRef = new WeakReference<>(abc); //弱引用
        println(weakRef.get()); //abc

        abc = null; //去掉强引用

        println(weakRef.get()); //abc

        System.gc(); //启动垃圾回收
        println(weakRef.get()); //null
    }

    private static void println(Object obj) {
        System.out.println(obj); //sout
    }
}

 通过 System.gc();启动垃圾回收后,此时不管内存空间是否足够,垃圾回收器回收了str变量的内存,因此输出结果是:null 。 

posted @ 2019-07-25 01:34  茗::流  阅读(182)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。