HotSpot算法实现

1.枚举根节点

可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中。

可达性分析对执行时间的敏感体现在GC停顿上,因为分析工作必须在能确保一致性的快照中进行,即不可以出现在分析过程中对象引用关系还在不断变化,所以这是导致GC进行时必须停顿所有的Java执行线程。

如果当执行系统停顿后,一个不漏地检查完所有执行上下文和全局的引用位置,停顿的时间必然很长(对于一些大规模应用来说,停顿的时间无法忍受),所以虚拟机应当有办法直接得知哪些地方存放着对象引用,在HotSpot的实现中,是使用一组称为OopMap的数据结构来达到这个目的的,在类加载完成的时候,把对象什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也会在特定的位置记录下栈和寄存器中哪些位置是引用,这样,GC在扫描时就可以直接得知这些信息了。

2.安全点

在OoMap的协助下,HotSpot可以快速且准确地完成GC Roots枚举,但有另一个问题,OopMap内容变化的指令非常多,如果为每一个条指令都生成对应的OopMap,将需要大量的额外空间。

HotSpot没有为每条指令都生成OoMap,只是在“特定的位置”记录了这些信息,这些位置称为安全点,即程序执行时并非在所有的地方都能停下来GC,只有达到安全点才能暂停,安全点的选定不能太少以至让GC等待的时间太长,又不能过于频繁以至增大运行时的负荷。

如何让GC发生时,所有线程(除执行JNI调用的线程)都到最近的安全点停顿下来?

1.抢先式中断,不需要线程的执行代码主动配合,在GC发生时,首先把所有线程中断,如果有线程中断的地方不在安全点,就恢复线程,让它执行到安全点。

2.主动式中断,需要中断线程时,不直接对线程操作,而是设置一个标志,各个线程执行时主动去轮询这个标志,发现中断标志为真时就中断挂起。轮询标志的地方和安全点是重合的。

3.安全区域

安全点机制保证程序执行时,在不太长的时间内就会遇到可进入GC的安全点,但是,程序“不执行”的时候呢,程序不执行就是没有分配CPU时间,这时线程无法响应JVM的中断请求,JVM显然不太可能的等待线程重新被分配CPU时间。

安全区域是指一段代码片段之中,引用关系不会发生变化。在这个区域中的任意地方开始GC都是安全的。

在线程执行到安全区域代码时,首先标识自己进入安全区域,当这段时间里JVM发起GC,不用管标识为安全区域的线程了。在线程要离开安全区域时,要检查系统是否已经完成了根节点枚举,如果完成,线程继续执行,否则等待直到收到可以安全离开安全区域的信号为止。

时间: 2024-10-23 06:36:37

HotSpot算法实现的相关文章

Java虚拟机 垃圾收集算法及HotSpot算法实现

垃圾收集算法 一般来说,垃圾收集算法分为四类: 标记-清除算法 最基础的算法便是标记-清除算法(Mark-Sweep).算法分为“标记”和“清除”两个阶段:首先标记处需要收集的对象,在标记完成之后,再统一回收所有被标记的对象. 这是最简单的一种算法,但是缺点也是很明显的:一个是效率问题,标记和清除效率都不高.二是空间问题,清除之后会产生大量的空间碎片,导致之后分配大对象找不到足够的连续对象而不得不触发另一次垃圾收集动作.算法执行过程如下图. 复制算法 复制算法(Copying)将可用内存按照容量

【005】【JVM——Hotspot算法实现存活对象判定和垃圾收集】

Hotspot算法实现存活对象判断和垃圾收集 枚举根节点 作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,它们的数量庞大,逐个检查里面的引用,会消耗很多时间.其次,准确的可达性分析需要暂停用线程的执行. 目前的主流Java 虚拟机使用的都是准确式GC (准确式内存管理Exact Memory Management:虚拟机知道内存中某个位置的数据类型具体是什么),所以当执行系统停顿下米后, 并不需要一个不漏地检验所有执行上下文和全局的

HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据

本篇代码可在 http://download.csdn.net/detail/fansy1990/8502323下载. 前篇<HotSpot关联规则算法(1)-- 挖掘离散型数据>分析了离散型数据的HotSpot关联规则,本篇分析离散型和连续型数据的HotSpot关联规则挖掘. 1. 首先看下数据格式(txt文档): @attribute outlook {sunny, overcast, rainy} @attribute temperature numeric @attribute hum

HotSpot关联规则算法(1)-- 挖掘离散型数据

提到关联规则算法,一般会想到Apriori或者FP,一般很少有想到HotSpot的,这个算法不知道是应用少还是我查资料的手段太low了,在网上只找到很少的内容,这篇http://wiki.pentaho.com/display/DATAMINING/HotSpot+Segmentation-Profiling ,大概分析了一点,其他好像就没怎么看到了.比较好用的算法类软件,如weka,其里面已经包含了这个算法,在Associate--> HotSpot里面即可看到,运行算法界面一般如下: 其中,

深入理解java虚拟机(四)垃圾收集算法及HotSpot实现

垃圾收集算法 一般来说,垃圾收集算法分为四类: 标记-清除算法 最基础的算法便是标记-清除算法(Mark-Sweep).算法分为"标记"和"清除"两个阶段:首先标记处需要收集的对象,在标记完成之后,再统一回收所有被标记的对象. 这是最简单的一种算法,但是缺点也是很明显的:一个是效率问题,标记和清除效率都不高.二是空间问题,清除之后会产生大量的空间碎片,导致之后分配大对象找不到足够的连续对象而不得不触发另一次垃圾收集动作.算法执行过程如下图. 复制算法 复制算法(Co

Java虚拟机内存管理原理基础入门

Jdk:Java程序设计语言.Java虚拟机.Java API类库. Jdk是用于支持Java程序开发的最小环境. Jre:Java API类库中的Java SE API子集.Java虚拟机. Jre是支持Java程序运行的标准环境. Program Counter Register:较小的内存空间,可以看作当前线程所执行的字节码的行号指示器.是唯一一个Java虚拟机规范中没有规定OutOfMemoryError的区域. VM Stack:生命周期和线程相同,它描述了Java方法执行的内存模型:

运行时内存

1 程序计数器 线程私有,记录线程所执行的字节码行号指示器. 2 虚拟机栈  描述Java方法执行内存模型 , 进入一个方法创建栈帧. 3 Java堆   存放对象实例 4 方法区:编译后的代码数据,包括加载 的类信息,常量,静态变量. 5 常量池 :class文件常量池方法区一部分存放编译器生成的字面量和符号引用,加载时放入虚拟机的运行时常量池中 6 对像创建 : 1 类是否已经加载   2 为对象分配内存 类加载后,对象所需内存确定 , 内存空间初始化0,3 设置对象头部信息 (对象所属类,

JAVA虚拟机系列文章

本系列文章主要记录自己在学习<深入理解Java虚拟机-JVM高级特性与最佳实践>的知识点总结,文章内容都是基于周志明所著书籍的总结. 1.Java内存区域与溢出 2.垃圾收集器与内存分配策略 3.HotSpot算法实现 4.垃圾收集器 5.内存分配与回收策略 6.JVM调优总结:分代垃圾回收详述

深入理解Java虚拟机 学习总结

一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区 1.1 程序计数器 程序计数器是一块较小的内存,他可以看做是当前线程所执行的行号指示器.字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成.如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节