Hi, 我是Mic。

明天分享一道一线互联网公司必问的面试题。

”JVM如何判断一个对象能够被回收“

对于这个问题,来看看普通人和高手的答复。

普通人:

嗯。。。。。。。。。。

高手:

好的,面试官。

在JVM外面,要判断一个对象是否能够被回收,最重要的是判断这个对象是否还在被应用,只有没被应用的对象能力回收。

  1. 援用计数器,也就是为每一个对象增加一个援用计数器,用来统计指向以后对象的援用次数,

    如果以后对象存在利用的更新,那么就对这个援用计数器进行减少,一旦这个援用计数器变成0,就意味着它能够被回收了。

    这种办法须要额定的空间来存储援用计数器,然而它的实现很简略,而且效率也比拟高。

    不过支流的JVM都没有采纳这种形式,因为援用计数器在解决一些简单的循环援用或者相互依赖的状况时,

    可能会呈现一些不再应用然而又无奈回收的内存,造成内存泄露的问题。

  2. 可达性剖析,它的次要思维是,首先确定一系列必定不能回收的对象作为GC root,

    比方虚拟机栈外面的援用对象、本地办法栈援用的对象等,而后以GC ROOT作为起始节点,

    从这些节点开始向下搜寻,去寻找它的间接和间接援用的对象,当遍历完之后如果发现有一些对象不可达到,

    那么就认为这些对象曾经没有用了,须要被回收。

    在垃圾回收的时候,JVM会首先找到所有的GC root,这个过程会暂停所有用户线程,

    也就是stop the world,而后再从GC Roots这些根节点向下搜寻,可达的对象保留,不可达的就会回收掉。

    可达性剖析是目前支流JVM应用的算法。

    以上就是我对这个问题的了解。

总结

很多粉丝和我说,很多货色看完当前过一段时间就遗记了,问我是怎么记下来的。

我和他说,技术这些货色不须要记,你惟一能做的就是缩小碎片化的学习,多花一点工夫在零碎学习上,只有体系化的常识是不会遗记的。

可是,搭建体系化常识的过程要比碎片化的点状学习苦楚不止一万倍。

技术的积淀是没有捷径的,只能花苦功夫去学习。

喜爱我的作品的小伙伴记得点赞和珍藏。

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