!! 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
首发博客地址[1]
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。[2]
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. 引用类型的使用示例
下面以软引用为例,来展示引用类型的使用示例:
代码语言:javascript复制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 中用于引用对象的类型,包括强引用、软引用、弱引用、虚引用和自定义引用类型。每种引用类型在对象被垃圾回收的时机和方式上略有区别,可以根据需求选择合适的引用类型来管理对象的生命周期。引用类型可以帮助我们更灵活地管理内存,但过度使用可能导致内存泄漏和性能问题,需谨慎使用。
写在最后
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。[3]
学习建议
这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。
参考资料
[1]
首发博客地址: https://blog.zysicyj.top/
[2]
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。: https://store.amazingmemo.com/chapterDetail/1685324709017001
[3]
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。: https://store.amazingmemo.com/chapterDetail/1685324709017001
本文由 mdnice 多平台发布