Java中的五种引用类型

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001


1. 什么是引用类型?

引用类型是指在Java中,用于引用(指向)某个对象的类型。Java中共有五种引用类型,包括强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)和自定义引用类型。

2. 为什么需要引用类型?

Java中的对象都是通过引用指向的,而不是直接操作对象本身。引用类型的存在可以帮助我们更灵活地管理内存,解决对象的生命周期管理问题。不同类型的引用可以根据需求来决定对象是否活跃,是否可以被垃圾回收。

3. 引用类型的实现原理

3.1 强引用(Strong Reference)

  • 强引用是最常见的引用类型,使用最普遍的引用方式。通过new操作符创建的对象默认就是强引用。

  • 强引用的对象在任何时间都不会被垃圾回收器回收,只有在没有任何强引用指向这个对象时,才会被回收。

  • 强引用的对象会一直保存在内存中,直到程序结束或者手动置空。

  • 强引用的使用场景:大部分的对象都是通过强引用来引用的,如普通的对象引用和静态变量引用。

3.2 软引用(Soft Reference)

  • 软引用是比弱引用强一点的引用类型。通过软引用创建的对象在内存足够的情况下不会被垃圾回收器回收,只有在内存不够时才会被回收。

  • 当内存空间不足时,垃圾回收器会回收软引用关联的对象,以释放内存,以保证系统的健壮性。

  • 软引用的使用场景:适合做缓存、图片加载等场景,可以在内存不足时释放一些非必要的对象,以避免内存溢出。

3.3 弱引用(Weak Reference)

  • 弱引用是比软引用更弱的引用类型。通过弱引用创建的对象在任何时候都可能被垃圾回收器回收。

  • 只要垃圾回收器发现了某个对象只有弱引用指向它,就会立即回收这个对象。弱引用被垃圾回收时,Java虚拟机会自动把这个弱引用加入到与之关联的ReferenceQueue队列中。

  • 弱引用的使用场景:适合一些非关键的缓存场景,当需要立即释放对象内存时,可以使用弱引用。

3.4 虚引用(Phantom Reference)

  • 虚引用是Java中最弱的引用类型。通过虚引用创建的对象在任何时候都可能被垃圾回收器回收。

  • 虚引用的主要目的是在对象被垃圾回收器回收时收到一个系统通知,通过虚引用关联的ReferenceQueue来实现。

  • 虚引用本身并不能通过它访问到对象,因此虚引用必须和引用队列(ReferenceQueue)一起使用。

  • 虚引用的使用场景:主要用于管理直接内存映射的释放,如NIO中的DirectByteBuffer。

3.5 自定义引用类型

除了上述四种常见的引用类型外,我们也可以根据自己的需求定义自己的引用类型。自定义引用类型可以根据实际情况来管理对象的生命周期,实现更加灵活的引用策略。

4. 引用类型的使用示例

下面以软引用为例,来展示引用类型的使用示例:

import java.lang.ref.SoftReference;

public class ReferenceExample {
    public static void main(String[] args) {
        String str = new String("Hello World");
        SoftReference<String> softReference = new SoftReference<>(str);
        str = null; // 手动置空强引用
        System.out.println(softReference.get()); // 输出:Hello World
    }
}

5. 引用类型的优点

  • 可以帮助我们更灵活地管理内存,解决对象的生命周期管理问题。

  • 不同类型的引用可以根据需求来决定对象是否活跃,是否可以被垃圾回收。

6. 引用类型的缺点

  • 过度使用引用类型可能导致内存泄漏和性能问题,需要根据具体情况和需求来选择适当的引用类型。

7. 引用类型的使用注意事项

  • 需要根据具体场景选择合适的引用类型,避免内存泄漏和性能问题。

  • 当使用软引用、弱引用和虚引用时,需要结合ReferenceQueue来实现更灵活的引用策略。

8. 总结

引用类型是Java中用于引用对象的类型,包括强引用、软引用、弱引用、虚引用和自定义引用类型。每种引用类型在对象被垃圾回收的时机和方式上略有区别,可以根据需求选择合适的引用类型来管理对象的生命周期。引用类型可以帮助我们更灵活地管理内存,但过度使用可能导致内存泄漏和性能问题,需谨慎使用。

最后更新于