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 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!