【读书会第十二期】Java虚拟机垃圾回收
【摘要】 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)