1. 前言
今天学习了「Java核心技术36讲」的第4讲关于强引用、软引用、弱引用、幻象引用的区别,理解了引用对于Java对象生命周期与JVM内部相关机制,在这里总结一下相关的知识点
2. Java中的数据类型
-
原始数据类型
包括了byte、int、char、long、float、double、boolean和short,还有对应的封装类Boolean、Character、Byte、Short、Integer、Long、Float、Double,在声明原始数据类型的变量后会直接将值存储在栈(stack)中,所以原始数据类型的缺省值是根据不同类型说定,如:int类型的缺省值为0 -
引用数据类型
包括class、interface、array,在声明引用数据类型的变量后在栈(stack)中存储的只是内存地址(类似C/C++的指针),真正的值是存在堆(heap)中,所以引用类型的缺省值为null -
知识点的应用
- 引用数据类型间的"=="判断内存地址是否相等,想判断内容实体需要使用equals
- 原始数据类型传值传参传的是副本,修改后原值不变;而引用数据类型传值传参穿的是地址,修改后原值改变
3. 四种引用
不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾回收的影响
3.1 强引用(StrongReference)
强引用是我们最常使用的普通对象引用,举个例子:
Object obj = new Object();//这种就是强引用
只要有强引用指向的对象,就表明这个对象不会被回收,即使JVM内存空间不足,抛出OutOfMemoryError(OOM)也不会回收具有强引用的对象。对于一个普通的对象,如果没有其他的引用关系,在超过了引用的作用域或者显示地将其赋值为null时,才可被垃圾收集
3.2 软引用(SoftReference)
通过SoftReference类实现,软引用的生命周期比强引用较短,当JVM内存不足时,才会试图去回收软引用指向的对象,即在抛出OutOfMemoryError前清理软引用指向的对象。
- 应用场景:图片缓存框架
3.3 弱引用(WeakReference)
通过WeakReference类实现,弱引用的生命周期比软引用还短。在垃圾回收器线程扫描内存区域时,一旦发现了具有弱引用的对象,不论当前内存空间是否充足,都会进行回收。
3.4 幻象引用(PhantomReference)
也可以叫做虚引用(还有人叫幽灵引用),通过PhantomReference类实现。无法通过虚引用访问对象的任何属性或函数,幻象引用只提供了一种确保对象被finalize后,做某些事情的机制。如果一个对象只有幻象引用,那么它随时可能被垃圾回收器回收。
4. 总结
由于之前的学习比较随意,导致很多知识点的掌握程度都很低,平时的开发过程中并没有直接使用到后三种引用,所以对这四种引用都不了解,甚至没有听过后三种引用。由此可见学习还是得脚踏实地,熟悉掌握了这些基础的知识,对以后设计缓存等框架,诊断OOM等问题都有很大帮助。
另外这里贴一个评论区的兄弟(@海怪哥哥)的理解,挺有意思的:
强引用就像大老婆,关系很稳固
软引用就像二老婆,随时有失宠的可能,但也有可能扶正
弱引用就像情人,关系不稳定,可能跟别人跑了
幻象引用就是梦中情人,只在梦中出现过
5. 最后
本文部分内容摘抄于「极客时间」的Java核心技术36讲中的内容和评论中@代码荣耀这个兄弟,在此感谢!
欢迎来看我的博客 RoNnx的博客