【读书会第十二期】Java虚拟机垃圾回收

举报
蛋挞挞挞挞挞 发表于 2022/05/18 23:09:41 2022/05/18
1.5k+ 0 0
【摘要】 Java堆和方法区这两个区域有着很显著的不确定性:一个接口的多个实现类需要的内存可能会不一样,一个方法则执行的不同条件分支所需要的内存也可能不一样,只有处于运行期间,我们才能知道程序究竟会创建哪些对象,创建多少个对象。

判断对象是不是垃圾

目前主要有两种方法,一个是引用计数法 还有一个是可达性分析算法也叫根搜算法。

1. 引用计数法(Reference Counting)
引用计数法比较简单,就是字面意思。给对象添加计数器,当对象每被引用一次,计数器就+1;相反,当对象引用每被失效一次,计数器就-1 ,当对象计数器为0的时候就可以判断为垃圾。

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

GC Roots对象的包括如下几种:

虚拟机栈(栈桢中的本地变量表)中的引用的对象(线程栈的变量)

方法区中的类静态属性引用的对象

方法区中的常量引用的对象

本地方法栈中JNI(即一般说的Native方法)的引用的对象

jvm中垃圾回收算法分别是标记-清楚算法,复制算法,标记-整理算法,以及分代收集算法。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。