栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

jvm中的判断GC垃圾回收算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

jvm中的判断GC垃圾回收算法

一,什么是垃圾,怎么判定一个对象在jvm里面是不是垃圾呢?

对于jvm来说垃圾就是一个没有价值的对象,对象没有被使用就是没有价值的垃圾对象。在jvm这个内存世界中对象太多了,而jvm中的内存却是有限的,总要有规则来管理判断每个对象是不是垃圾然后进行处理。目前主要有两种方法,一个是引用计数法 还有一个是可达性分析算法也叫根搜算法 ,Java中使用的是根搜算法。

     引用计数法(Reference Counting)

引用计数法比较简单,就是字面意思。给对象添加计数器,当对象每被引用一次,计数器就+1;相反,当对象引用每被失效一次,计数器就-1 ,当对象计数器为0的时候就可以判断为垃圾。引用计数算法简单高效,但是java中却没有使用,原因就是他无法处理循环引用的问题。按照此算法的逻辑,只有计数器是非0就不是垃圾,如果在一个循环中存在A,B两个对象互相引用(计数器各自+1),但是有没有被别的对象引用,实际上这两个对象没有被使用,但是也不会被回收,当这一个循环结束时,应该要回收使用过的对象,而AB两个由于互相引用导致他们的计数器不可能变更为0,就像两个连着的小船漂在内存的大海中一样。当这种互相引用的对象越来越多,而且不会去标记变成可回收的垃圾对象,这样内存就会急剧告急,就扛不住了报OOM异常了。

2. 可达性分析算法(GC Roots Tracing) 

在主流的商用程序语言中(Java和C#),都是使用根搜索算法(GC Roots Tracing)判断对象是否存活的。这个算法的基本思路就是通过一系列名为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的没有使用的,就是判定此对象为可回收的对象。如下图:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/710042.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号