JVM强引用、软引用、弱引用、虚引用,以及它们的区别

JVM是Java虚拟机的缩写,Java虚拟机是一种在计算机上运行Java字节码的虚拟机。Java虚拟机管理内存时,通常使用四种引用类型:强引用、软引用、弱引用和虚引用。这些引用类型的区别在于它们对对象的生命周期和垃圾回收的影响。

强引用(Strong Reference)

强引用是默认的引用类型。如果一个对象具有强引用,即使内存空间不足,垃圾回收器也不会回收该对象,除非该对象没有被任何引用所引用。如果一个对象的强引用变为null,则该对象成为垃圾,可能在以后的某个时间被垃圾回收器回收。

示例代码:

Object obj = new Object(); // 创建一个对象
Object strongRef = obj; // 强引用指向该对象
obj = null; // 解除原来的引用

软引用(Soft Reference)

软引用是一种不太强的引用类型,如果一个对象只有软引用,则在内存空间不足时,垃圾回收器会尝试回收该对象。软引用通常用于缓存中,以便在内存不足时可以清除不必要的缓存对象。可以使用java.lang.ref.SoftReference来创建一个软引用。

示例代码:

Object obj = new Object(); // 创建一个对象
SoftReference<Object> softRef = new SoftReference<>(obj); // 软引用指向该对象
obj = null; // 解除原来的引用

弱引用(Weak Reference)

弱引用也是一种不太强的引用类型,如果一个对象只有弱引用,则在下一次垃圾回收时,垃圾回收器将回收该对象,无论内存空间是否充足。可以使用java.lang.ref.WeakReference来创建一个弱引用。

示例代码:

Object obj = new Object(); // 创建一个对象
WeakReference<Object> weakRef = new WeakReference<>(obj); // 弱引用指向该对象
obj = null; // 解除原来的引用

虚引用(Phantom Reference)

虚引用是最不强的引用类型,它不能用于检索对象,也不能保留对象存活。它的唯一作用是当对象被垃圾回收时,虚引用将被添加到引用队列中,以便在对象被回收时执行一些特定操作,例如清除对该对象的引用。可以使用java.lang.ref.PhantomReference来创建一个虚引用。

示例代码:

Object obj = new Object(); // 创建一个对象
ReferenceQueue<Object> queue = new ReferenceQueue<>(); // 创建一个引用队列
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue); // 虚引用指向该对象
obj = null; // 解除原来的引用

总结对比

引用类型 是否可以被回收 是否有get()方法 是否有构造方法
强引用
软引用 内存不足时可以被回收
弱引用 只要垃圾回收器工作就会被回收
虚引用 无法通过虚引用访问到对象,垃圾回收器回收对象时将信息放到ReferenceQueue

可以通过以下代码检查引用对象是否被回收:

System.out.println("Object from soft reference: " + softRef.get()); // 检查软引用对象是否被回收
System.out.println("Object from weak reference: " + weakRef.get()); // 检查弱引用对象是否被回收
System.out.println("Object from phantom reference: " + phantomRef.get()); // 检查虚引用对象是否被回收

注意:以上代码只是示例,实际使用中应该根据具体情况进行引用类型的选择和使用。另外,需要注意的是,虚引用必须与引用队列一起使用,否则将没有任何作用。可以使用以下代码检查引用队列中是否有虚引用对象:

Reference<?> ref = null;
while ((ref = queue.poll()) != null) {
    System.out.println("Object from phantom reference is enqueued: " + ref);
}

在上面的代码中,poll()方法用于从引用队列中获取一个引用对象。如果队列为空,则返回null。如果队列中有对象,则返回引用对象。可以在程序的适当位置加入该代码来检查虚引用对象是否被回收。

以下是一个简单的使用四种引用类型的例子:

public class ReferenceExample {
    public static void main(String[] args) {
        // 强引用
        Object obj1 = new Object();

        // 软引用
        SoftReference<Object> obj2 = new SoftReference<>(new Object());

        // 弱引用
        WeakReference<Object> obj3 = new WeakReference<>(new Object());

        // 虚引用
        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        PhantomReference<Object> obj4 = new PhantomReference<>(new Object(), queue);
        
        // 对象不再被引用
        obj1 = null;
        obj2 = null;
        obj3 = null;
        obj4 = null;

        // 垃圾回收器运行
        System.gc();

        // 打印引用状态
        System.out.println("obj1 is " + (obj1 == null ? "null" : "not null"));
        System.out.println("obj2 is " + (obj2.get() == null ? "null" : "not null"));
        System.out.println("obj3 is " + (obj3.get() == null ? "null" : "not null"));
        System.out.println("obj4 is " + (queue.poll() == null ? "null" : "not null"));
    }
}

总之,了解这些引用类型的差异可以帮助开发人员更好地管理内存和垃圾回收。在实际开发中,应根据具体需求选择适当的引用类型。

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

推荐阅读更多精彩内容