共计 925 个字符,预计需要花费 3 分钟才能阅读完成。
Hi,我是 Mic。
明天分享一道一线互联网公司必问的面试题。
”JVM 如何判断一个对象能够被回收“
对于这个问题,来看看普通人和高手的答复。
普通人:
嗯。。。。。。。。。。
高手:
好的,面试官。
在 JVM 外面,要判断一个对象是否能够被回收,最重要的是判断这个对象是否还在被应用,只有没被应用的对象能力回收。
援用计数器,也就是为每一个对象增加一个援用计数器,用来统计指向以后对象的援用次数,
如果以后对象存在利用的更新,那么就对这个援用计数器进行减少,一旦这个援用计数器变成 0,就意味着它能够被回收了。
这种办法须要额定的空间来存储援用计数器,然而它的实现很简略,而且效率也比拟高。
不过支流的 JVM 都没有采纳这种形式,因为援用计数器在解决一些简单的循环援用或者相互依赖的状况时,
可能会呈现一些不再应用然而又无奈回收的内存,造成内存泄露的问题。
可达性剖析,它的次要思维是,首先确定一系列必定不能回收的对象作为 GC root,
比方虚拟机栈外面的援用对象、本地办法栈援用的对象等,而后以 GC ROOT 作为起始节点,
从这些节点开始向下搜寻,去寻找它的间接和间接援用的对象,当遍历完之后如果发现有一些对象不可达到,
那么就认为这些对象曾经没有用了,须要被回收。
在垃圾回收的时候,JVM 会首先找到所有的 GC root,这个过程会暂停所有用户线程,
也就是 stop the world,而后再从 GC Roots 这些根节点向下搜寻,可达的对象保留,不可达的就会回收掉。
可达性剖析是目前支流 JVM 应用的算法。
以上就是我对这个问题的了解。
总结
很多粉丝和我说,很多货色看完当前过一段时间就遗记了,问我是怎么记下来的。
我和他说,技术这些货色不须要记,你惟一能做的就是缩小碎片化的学习,多花一点工夫在零碎学习上,只有体系化的常识是不会遗记的。
可是,搭建体系化常识的过程要比碎片化的点状学习苦楚不止一万倍。
技术的积淀是没有捷径的,只能花苦功夫去学习。
喜爱我的作品的小伙伴记得点赞和珍藏。
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!