“强援用、软援用、弱援用、虚援用有什么区别?”

这个问题难倒了很多资深Java工程师,不是因为这个问题自身有多难。

而是的确它是一个比拟小众的知识点。

大家好,我是Mic,一个工作了14年的Java程序员。

明天给大家分享一下这道面试题的规范答复。

文字版本我整顿到了一个15W字的面试文档外面,大家能够私信我支付

上面看看高手的答复。

高手:

不同的援用类型,次要体现的是对象不同的可达性状态和对垃圾收集的影响。

强援用,就是一般对象的援用,只有还有强援用指向一个对象,就能示意对象还“活着”,垃圾收集器无奈回收这一类对象。

只有在没有其余援用关系,或者超过了援用的作用域,再或者显示的把援用赋值为null的时候,垃圾回收器能力进行内存回收。

软援用,是一种绝对强援用弱化一些的援用,能够让对象豁免一些垃圾收集,只有当 JVM 认为内存不足时,才会去试图回收软援用指向的对象。

软援用通常用来实现内存敏感的缓存,如果还有闲暇内存,就能够临时保留缓存,当内存不足时清理掉,这样就保障了应用缓存的同时,不会耗尽内存。

弱援用,绝对强援用而言,它容许在存在援用关联的状况下被垃圾回收的对象在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具备弱援用的对象,不论以后内存空间足够与否,垃圾回收期都会回收该内存虚援用,它不会决定对象的生命周期,它提供了一种确保对象被finalize当前,去做某些事件的机制。

当垃圾回收器筹备回收一个对象时,如果发现它还有虚援用,就会在回收对象的内存之前,把这个虚援用退出到与之关联的援用队列中。

程序能够通过判断援用队列中是否曾经退出了虚援用,来理解被援用的对象是否将要进行垃圾回收,而后咱们就能够在援用的对象的内存回收之前采取必要的口头。

总结

这是一个好问题,它整体波及到的知识点,如果要深度开掘。

还能够往对象的可达性状态剖析以及GC的回收原理进行开展。

不过的确也是一个比拟偏门的问题,更多会利用在一些类库或者框架外面。

有趣味的小伙伴能够跟进一步去深度钻研。

大家记得点赞、珍藏加关注。

版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 Mic带你学架构
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!