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

文章图片

文章图片

文章图片

文章图片

文章图片

文章图片

文章图片

文章图片

文章图片
众所周知 , Java中是JVM负责内存的分配和回收 , 这是它的优点(使用方便 , 程序不用再像使用c那样操心内存) , 但同时也是它的缺点(不够灵活) 。 为了解决内存操作不灵活这个问题 , Java采用了软引用等方法 。
在JDK1.2以前的版本中 , 当一个对象不被任何变量引用 , 那么程序就无法再使用这个对象 。 也就是说 , 只有对象处于可触及状态 , 程序才能使用它 。 这就像在日常生活中 , 从商店购买了某样物品后 , 如果有用 , 就一直保留它 , 否则就把它扔到垃圾箱 , 由清洁工人收走 。 一般说来 , 如果物品已经被扔到垃圾箱 , 想再把它捡回来使用就不可能了 。
但有时候情况并不这么简单 , 你可能会遇到类似鸡肋一样的物品 , 食之无味 , 弃之可惜 。 这种物品现在已经无用了 , 保留它会占空间 , 但是立刻扔掉它也不划算 , 因 为也许将来还会派用场 。 对于这样的可有可无的物品 , 一种折衷的处理办法是:如果家里空间足够 , 就先把它保留在家里 , 如果家里空间不够 , 即使把家里所有的垃 圾清除 , 还是无法容纳 , 那么就扔掉这些可有可无的物品 。
从JDK1.2版本开始 , 把对象的引用分为四种级别 , 从而使程序能更加灵活的控制对象的生命周期 。 这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用 。
1、强引用我们使用的大部分引用实际上都是强引用 , 这是使用最普遍的引用 。 如果一个对象具有强引用 , 那就类似于必不可少的生活用品 , 垃圾回收器绝不会回收它 。 当内存空间不足 , Java虚拟机宁愿抛出OutOfMemoryError错误 , 使程序异常终止 , 也不会靠随意回收具有强引用的对象来解决内存不足问题 。 看下面代码 , s和list都是强引用 , 即使内存不足也不会释放其空间 。
下图是ArrayList的clear方法源码 , 在ArrayList类中定义了一个私有的变量elementData数组 , 在调用方法清空数组时可以看到为每个数组对象引用赋值为null , 让GC去回收被引用的对象占用的内存 。 而elementData是不为空的 , 强引用仍然存在 , 避免在后续调用 add()等方法添加元素时进行重新的内存分配 。 clear()方法中释放内存的方法对数组中存放的引用类型特别适用 , 这样就可以及时释放内存 。
推荐阅读
- 华为|麒麟9000库存可期,余承东放出猛料,台积电仍在为华为代工
- 华为|华为再添一大利器,高端光刻机几乎没用了,每年可节省数万亿资金
- 华为|光刻机将成废铁?华为“重磅”出现,网友感慨:厉害了,华为
- 华为荣耀|荣耀30 pro跌至“学生价”,小米10首当其冲!
- 华为mate|华为mate40即将发布!双曲面+90Hz+麒麟芯,能买到全靠运气
- 阿里巴巴|华为和阿里巴巴谁的国际影响也更大,马云:你见过特朗普吗?
- 华为|华为专家拿上百万年薪!却毫无作为引发质疑?任正非极力袒护!
- 硅谷聊科技|就不愿再用华为、小米了?,答案确认了!为啥很多人用了iPhone后
- 芯片|美国的芯片“圈套”被破解,华为突破重围,光刻机不再是“软肋”
- 中芯国际|这回真的让人失望!华为宣布决定,中芯国际慌了?
