华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用


华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片
华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片
华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片
华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片
华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片
华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片
华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片
华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片
华为|面试加分项:Java引用还有分类?强引用、弱引用、软引用、虚引用
文章图片

众所周知 , Java中是JVM负责内存的分配和回收 , 这是它的优点(使用方便 , 程序不用再像使用c那样操心内存) , 但同时也是它的缺点(不够灵活) 。 为了解决内存操作不灵活这个问题 , Java采用了软引用等方法 。
在JDK1.2以前的版本中 , 当一个对象不被任何变量引用 , 那么程序就无法再使用这个对象 。 也就是说 , 只有对象处于可触及状态 , 程序才能使用它 。 这就像在日常生活中 , 从商店购买了某样物品后 , 如果有用 , 就一直保留它 , 否则就把它扔到垃圾箱 , 由清洁工人收走 。 一般说来 , 如果物品已经被扔到垃圾箱 , 想再把它捡回来使用就不可能了 。
但有时候情况并不这么简单 , 你可能会遇到类似鸡肋一样的物品 , 食之无味 , 弃之可惜 。 这种物品现在已经无用了 , 保留它会占空间 , 但是立刻扔掉它也不划算 , 因 为也许将来还会派用场 。 对于这样的可有可无的物品 , 一种折衷的处理办法是:如果家里空间足够 , 就先把它保留在家里 , 如果家里空间不够 , 即使把家里所有的垃 圾清除 , 还是无法容纳 , 那么就扔掉这些可有可无的物品 。
从JDK1.2版本开始 , 把对象的引用分为四种级别 , 从而使程序能更加灵活的控制对象的生命周期 。 这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用 。
1、强引用我们使用的大部分引用实际上都是强引用 , 这是使用最普遍的引用 。 如果一个对象具有强引用 , 那就类似于必不可少的生活用品 , 垃圾回收器绝不会回收它 。 当内存空间不足 , Java虚拟机宁愿抛出OutOfMemoryError错误 , 使程序异常终止 , 也不会靠随意回收具有强引用的对象来解决内存不足问题 。 看下面代码 , s和list都是强引用 , 即使内存不足也不会释放其空间 。
下图是ArrayList的clear方法源码 , 在ArrayList类中定义了一个私有的变量elementData数组 , 在调用方法清空数组时可以看到为每个数组对象引用赋值为null , 让GC去回收被引用的对象占用的内存 。 而elementData是不为空的 , 强引用仍然存在 , 避免在后续调用 add()等方法添加元素时进行重新的内存分配 。 clear()方法中释放内存的方法对数组中存放的引用类型特别适用 , 这样就可以及时释放内存 。


推荐阅读