博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
五、Hotspot中高效的垃圾回收算法实现
阅读量:6800 次
发布时间:2019-06-26

本文共 798 字,大约阅读时间需要 2 分钟。

hot3.png

一、枚举根节点

  1. 在可达性分析中使用常量或者静态变量作为根节点,但是在很多应用中,仅仅方法区就有数百兆,如果逐个检查会消耗很多时间
  2. GC停顿:在检查对象死亡时需要确保一致性,所以在整个分析期间,虚拟机必须停掉所有线程
  3. Hotspot使用了一种OopMap的数据结构,他可以知道哪些地方存放着哪些对象引用,不需要在GC停顿的时候进行遍历,节省时间

二、安全点

  1.  OopMap可以很高效的完成GC Roots枚举,但是在实际应用过程中,导致OopMap结构变化的指令非常多,如果每次变化都产生新的OopMap,那么GC的空间成本将变得很高
  2. 所以Hotspot只在安全点(Safepoint)上进行暂停
  3. 安全点的选择遵循“是否具有让程序长时间执行的特征”,即方法调用、循环跳转、异常跳转的才会产生SafePoint
  4. 在GC发生时,如何让所有线程都在安全点上停顿下来呢,有两种方式,第一是抢先式中断,第二种是主动式中断
  5. 抢先式中断:就是当GC发生时,如果发现某一线程不在安全点上,则恢复线程让它跑到安全点上停下来
  6. 主动式中断:不直接对线程进行操作,设置一个标志,各个线程主动轮询这个标志,如果标志为真(发生GC)则线程暂停(Hotspot使用这种方式)

三、安全区域

  1. 安全点可以解决正在执行的线程在GC时停顿的一致性,那么如果是线程在Sleep状态,或者Blocked状态呢
  2. 这时引入安全区域(SafeRegion)的概念,在线程进入“不执行”状态时,标记自己进入Safe Region,这样在GC时,就不用管Safe Region的线程了
  3. 在线程要离开Safe Region时,需要检查系统是否已经完成根节点枚举或者整个GC过程,如果完成了,则线程继续执行,否则需要等到可以安全离开Safe Region为止

转载于:https://my.oschina.net/u/3001485/blog/801188

你可能感兴趣的文章
PCB_栅格大小设置
查看>>
在eclipse 的整个工程中查找字符串
查看>>
[转]Android中的Intent详细讲解
查看>>
电商也要懂的实体渠道实战知识zz
查看>>
命令行管理远程windows.(Remote Command Line On Windows)
查看>>
调用webservice使用URLConnection调用webservice
查看>>
父亲节例行吐槽
查看>>
c#动态创建ODBC数据源
查看>>
修改visual studio2010 的快捷键,使用ctrl+W 关闭当前文档
查看>>
ckeditor
查看>>
pwd显示链接文件的真实路径
查看>>
架构和框架的区别
查看>>
webservice系统学习笔记5-手动构建/发送/解析SOAP消息
查看>>
[原创]项目管理知识体系指南之 4项目整合管理思维导图
查看>>
经典网页设计:20个华丽的 iPhone 应用程序演示网站
查看>>
Flash:DisplayObject的transform/matrix的潜规则、小bug
查看>>
汗,Google又调整了编译工具(升级SDK先备份!!!)
查看>>
iOS 里RGB 配色 UIColor colorWithRed
查看>>
关闭Outlook时最小化 dll
查看>>
菜鸟学SSH(一)——Struts实现简单登录(附源码)
查看>>