【JVM】深入理解Java引用类型:强引用、软引用、弱引用和虚引用

dd3f5d43598c2a98a8352180c00a09de.png

人不走空

                                                                      

      🌈个人主页:人不走空      

💖系列专栏:算法专题

⏰诗词歌赋:斯是陋室,惟吾德馨

da14e5cf865a427ea959fca470d8245a.gif

7f46f81fe3a945d7999e42aba5d5e295.png

导言: 在Java中,引用类型是内存管理的重要组成部分。本文将深入介绍强引用、软引用、弱引用和虚引用,为您解析它们的特性以及如何在实际应用中巧妙利用。


目录

      🌈个人主页:人不走空      

💖系列专栏:算法专题

⏰诗词歌赋:斯是陋室,惟吾德馨

1. 强引用(Strong Reference):

2. 软引用(Soft Reference):

3. 弱引用(Weak Reference):

4. 虚引用(Phantom Reference):

作者其他作品:


1. 强引用(Strong Reference):

  • 定义: 强引用(Strong Reference)是Java中最为普遍的引用类型。当一个对象被强引用关联时,垃圾回收器不会回收这个对象,即使系统内存不足也不会回收。只有当该对象的强引用被显式地释放,或者不再被任何引用关联时,该对象才会成为垃圾回收的候选对象。
  • 示例代码:
     
    public class StrongReferenceExample {
        public static void main(String[] args) {
            // 创建一个对象并建立强引用
            Object obj = new Object(); // 强引用
    
            // 对象仍然存在,可以正常使用
            System.out.println("Object is still accessible.");
    
            // 解除对对象的强引用
            obj = null;
    
            // 系统内存充足时,垃圾回收器可能不会立即回收
            // 只有在需要释放内存时,垃圾回收器才会回收不再被引用的对象
        }
    }
    

    在这个例子中,创建了一个对象并建立了强引用。即使在解除对对象的强引用后,只要系统内存充足,垃圾回收器不会立即回收对象。强引用使得对象在被引用时一直保持有效,直到引用被显式解除。

2. 软引用(Soft Reference):

  • 定义: 软引用用于描述一些还有用但并非必须的对象,在内存不足时可能被垃圾回收。
  • 示例代码:
     
    import java.lang.ref.SoftReference;
    
    public class SoftReferenceExample {
        public static void main(String[] args) {
            // 创建一个大对象
            byte[] largeObject = new byte[10 * 1024 * 1024]; // 10MB
    
            // 使用软引用关联这个大对象
            SoftReference<byte[]> softReference = new SoftReference<>(largeObject);
    
            // 大对象不再被强引用,但仍然被软引用关联
    
            // 尝试获取软引用关联的对象
            byte[] retrievedObject = softReference.get();
    
            if (retrievedObject != null) {
                System.out.println("对象仍然存在,无需重新创建。");
            } else {
                System.out.println("对象已被回收,需要重新创建。");
            }
        }
    }
    

    在这个例子中,创建了一个10MB大小的大对象,并使用软引用SoftReference与之关联。然后,尝试通过软引用获取对象。如果内存足够,对象就会保留;如果内存不足,垃圾回收器可能会回收该对象。这样,软引用允许在内存不足时释放一些非必要的对象,从而提高系统的内存利用率。

3. 弱引用(Weak Reference):

  • 定义: 弱引用(Weak Reference)是Java中一种比强引用更弱的引用类型。当一个对象只被弱引用关联时,在下一次垃圾回收时,该对象就有可能被回收。垃圾回收器会在适当的时候回收仅被弱引用持有的对象,即使内存并不紧张。
  • 示例代码:
    import java.lang.ref.WeakReference;
    
    public class WeakReferenceExample {
        public static void main(String[] args) {
            // 创建一个对象并建立弱引用
            Object obj = new Object();
            WeakReference<Object> weakRef = new WeakReference<>(obj);
    
            // 对象仍然存在,可以正常使用
            System.out.println("Object is still accessible: " + weakRef.get());
    
            // 解除对对象的强引用
            obj = null;
    
            // 手动触发垃圾回收
            System.gc();
    
            // 垃圾回收后,对象被回收,弱引用返回null
            System.out.println("Object after garbage collection: " + weakRef.get());
        }
    }
    

    在这个例子中,创建了一个对象并建立了弱引用。解除对对象的强引用后,手动触发垃圾回收。由于只有弱引用关联该对象,垃圾回收器可能会在垃圾回收时回收这个对象。因此,通过弱引用可以更容易地允许对象在合适的时候被回收。

4. 虚引用(Phantom Reference):

  • 定义: 虚引用(Phantom Reference)是Java中最弱的引用类型之一,无法通过引用直接获取到对象实例。虚引用主要用于跟踪对象被垃圾回收的状态。当一个对象只被虚引用关联时,其实际上并不影响对象的生命周期,也就是说,垃圾回收器随时可能回收被虚引用关联的对象。
  • 示例代码:
    import java.lang.ref.PhantomReference;
    import java.lang.ref.ReferenceQueue;
    
    public class PhantomReferenceExample {
        public static void main(String[] args) {
            // 创建一个对象并建立虚引用
            Object obj = new Object();
            ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
            PhantomReference<Object> phantomRef = new PhantomReference<>(obj, referenceQueue);
    
            // 对象实例不能通过虚引用直接获取
            System.out.println("Object is not accessible: " + phantomRef.get());
    
            // 解除对对象的强引用
            obj = null;
    
            // 手动触发垃圾回收
            System.gc();
    
            // 虚引用将被放入引用队列
            if (referenceQueue.poll() != null) {
                // 在引用队列中发现引用,表示对象已被垃圾回收
                System.out.println("Object has been garbage collected.");
            }
        }
    }
    

    在这个例子中,创建了一个对象并建立了虚引用。由于虚引用无法通过get()方法获取对象实例,对象的生命周期不受虚引用的影响。解除对对象的强引用后,手动触发垃圾回收,虚引用将被放入引用队列。通过监测引用队列中是否有引用,可以了解对象是否已被垃圾回收。虚引用主要用于在对象被回收时执行一些清理操作。


结语: 深入理解Java引用类型有助于更有效地管理内存,并提高应用程序的性能。根据具体的场景,选择适当的引用类型是优化程序的关键一步。希望本文能够为您在Java引用类型的使用上提供清晰的指导。


作者其他作品:

数据结构之链表-CSDN博客

力扣1445 连续字符-CSDN博客

软件工程之维护阶段-CSDN博客

开源社区的力量:软件工程的协作新模式-CSDN博客

https://blog.csdn.net/double222222/article/details/134776271

 软件工程之设计分析(2)-CSDN博客

软件工程之设计分析(1)-CSDN博客

软件工程之需求分析-CSDN博客

软件工程之编码(1)-CSDN博客

https://blog.csdn.net/double222222/article/details/135334628?spm=1001.2014.3001.5502

【Linux】文件服务NFS(Network File System)-CSDN博客

软件工程之编码(2)-CSDN博客

  • 24
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人不走空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值