来自JVM的灵魂拷问:“你是什么垃圾?”
副标题[/!--empirenews.page--]
作者:iMononoke 博客:https://juejin.im/user/5c629a3051882562191755d8 GC是啥? GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。 就和平时你清理桌面,整理东西一样,很多人都见过听过一个理念“断舍离”吧,不会使用到的物品可以捐赠给其他人或者作为可回收物品被回收掉,很多时候我们存着一些物品,但是好几年都没有用到它们,只是想着可能什么时候会用到,这样一直占据着现实的“内存”。 “脏乱差” “干净~” 还“活着”吗? 在0-1的世界里,所谓“垃圾回收”,就是指收回那些不可能再被任何途径使用的对象所占的内存空间,释放了这些内存可以给需要的对象使用。 那么JVM里是怎么来分的?或者说哪些对象是需要被回收的? 主要是问一句:还“活着”吗? 要回收,先要判断是不是可以回收,就是这个对象还“活着”吗? 主要有两种算法来判断:
列个表看看~ 引用计数法 最大的问题,是很难解决对象之间互相引用的情况。 一图胜千言。 1 互相引用 这是两个对象互相引用的情况,除此之外,这两个对象再无引用,但因为它们的引用计数不为0,所以引用计数器无法通知GC收集器回收它们。 2 循环引用 这是循环引用的情况,没有外部引用指向它们,但它们的引用计数不为0,就无法进行回收了。 比如一把椅子的靠背坏了,椅子的轮子还是好的,但这轮子不能拆下来挪为他用,所以椅子的靠背和它的轮子是互相引用的,但是除了它们自己,没有外界引用它们了。 这样的情况用“引用计数法”来判断的话,它们还是不用被回收的,但实际它们都没有使用作用了。 所以主流的jvm都不使用引用计数法来管理内存,而是采用下面的可达性分析法,下图是它的基本思路示意图。
由图可知,object5、object6和object7都没有到GCRoots对象的引用链,它们都会被回收。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |