JAVA GC之标记  第五节

OK,我们继续昨天最后留下的问题,什么是标记?怎么标记?

第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理。 至于怎么标记,一般有两种方法:引用计数和可达性分析。

引用计数实现起来比较简单,就是给对象添加一个引用计数器,每当有一个地方引用它时就加1,引用失效时就减1,当计数器为0的时候就标记为可回收。这种判断效率很高,但是很多主流的虚拟机并没有采用这种方法,主要是因为它很难解决几个对象之间循环引用的问题,向下图这个例子这样发生循环引用。虽然不怎么用了,但还是值得我们学习!

可达性分析的基本思路就是:通过将一些称为"GC Roots"的对象作为起始点,从这些节点开始搜索,搜索和该节点发生直接或者间接引用关系的对象,将这些对象以链的形式组合起来,形成一张“关系网”,又叫做引用链。最后垃圾收集器就回收一些不在这张关系网上的对象。如图:

连接GC Roots对象的object是确定还存活的对象,而右边的die obj由于和GCROOTS没有关系,所以会标记为可回收的对象。目前主流的商用虚拟机用的都是类似的方法。那什么对象才能作为“GC Roots”呢?在java中,有四种对象可以作为“GC Roots”

1:栈帧(第一章的名词)中的引用对象。(栈中的)

2:静态属性引用的对象。(方法区中的)

3:常量引用的对象。(方法区中的)

4:本地方法栈中JNI引用的对象。(本地方法栈中的)

目前来说这两种标记的方法最为常用,带标记完成后就可以进行上一章所讲的回收方法了!

长按下方二维码获得更多猛料干货,觉得写得还不错的话就分享给大家吧!

最新文章

  1. 进程间通信--fork函数
  2. DOJO-dojox.grid.EnhancedGrid(带刷新函数,分页工具栏,复选框,行号等功能)
  3. subversion安装使用
  4. slide.js使用文档
  5. IntelliJ IDEA 目录技巧
  6. scala学习笔记(1)
  7. CentOS hadoop配置错误Incorrect configuration: namenode address dfs.namenode.servicerpc-address ...
  8. 用eclipse创建maven项目
  9. mysql 5.6 binlog组提交
  10. BeanFactory和FactoryBean
  11. sscanf、strsep
  12. JS cookie 读写操作
  13. Android(java)学习笔记239:多媒体之撕衣服的案例
  14. SpringMVC(三)——其他知识
  15. libevent简单介绍和使用
  16. Ubuntu火狐、Chromium等浏览器安装flash插件
  17. Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{...
  18. DNA Consensus String
  19. 4 Git 基础 - 撤消操作
  20. swift3.0之后的Error处理

热门文章

  1. Android学习总结——获取被启动的Activity传回的数据
  2. ARM64调试环境
  3. 【转载】【转自AekdyCoin的组合数取模】
  4. android开发MD5加密工具类(一)
  5. Java日志管理
  6. oracle 定义数据完整性
  7. ASP.NET 生命周期(原文翻译)
  8. JavaScript中的Math.ceil()、Math.round()、Math.floor()
  9. LPC基础教程-Lpc程序和编程环境 mudos 加载原理
  10. mongo设计(一)