文档章节

五、Hotspot中高效的垃圾回收算法实现

Swimmer
 Swimmer
发布于 2016/12/07 09:15
字数 573
阅读 14
收藏 0

一、枚举根节点

  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为止

© 著作权归作者所有

共有 人打赏支持
Swimmer
粉丝 2
博文 30
码字总数 12958
作品 0
朝阳
程序员
四、垃圾收集之垃圾收集算法

一、标记-清除算法 最基础的收集算法,其余的算法基本都是由此算法改进得来 效率不高,标记和清除的过程效率都不高 清除之后会产生大量的不连续的内存碎片 二、复制算法 为了解决标记-清除算...

Swimmer
2016/12/07
7
0
(五)-HotSpot垃圾收集器

HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器.我们可以根据自己实际的应用需求选择最适合的垃圾收集器. 根据新生代和老年代各...

芥末无疆sss
2017/12/19
0
0
《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记 JAVA 环境: JAVA虚拟机高级特性: 一:java内存区域与内存异常 一):运行数据区 1:程序计数器(Program Counter Register),也...

洋哥6
2015/10/06
1K
0
JAVA垃圾回收机制概要

垃圾回收是JAVA中的一个大知识点,也是一个著名知识点,毕竟JAVA号称自己先进性的时候总是会带上垃圾回收。于是,它也成了面试中的常客,面试官动不动的就要你解释下什么是垃圾回收,以及它的...

文艺小青年
2017/06/01
0
0
Java技术原理详解

一、Java 运行原理 1、高级语言运行过程 在程序真正运行在CPU上之前,必须要让OS的kernel理解我们在编辑器或者IDE里根据每种语言的语法规则敲入的源代码,kernel才能做出相关的调度,所以需要...

mrc_elite
2017/11/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
2
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
119
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
4
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部