文档章节

垃圾收集器与内存分配策略(三)之HotSpot的算法实现

PrivateO2
 PrivateO2
发布于 2017/08/01 10:19
字数 1040
阅读 3
收藏 0

垃圾收集器与内存分配策略(三)——HotSpot的算法实现

 

  在HotSpot虚拟机上实现这些算法时,必须对算法的执行效率有着严格的考量,才能保证虚拟机高效地运行。

1、 枚举根节点

  采用可达性分析从GC Roots节点中找引用链为例

  存在的缺点:
  1、在前面找出还存活对象时,采用可达性分析从GC Roots节点中找引用链时,可作为GC Roots的节点主要在全局性的引用(方法区的常量或类静态属性引用)与执行上下文(虚拟机栈栈帧中的本地变量表或本地方法栈中的Native方法的引用)中,很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,必然会消耗很多时间。

  2、可达性分析对时间的敏感还体现在GC停顿上,因为这项工作必须在一个能确保一致性的快照中进行。“一致性值的是”GC进行时必须停顿所有Java执行线程(Stop The World)。

  HotSpot的解决方式
  1、当执行系统停下来时,不需要检查完所有的全局和执行上下文的引用位置,HotSpot采用一组称为OopMap的数据结构来记录那些地方存放着对象的引用。

  2、JIT(即时编译)编译过程中也会在特定位置记录下栈和寄存器中那些位置是引用。

 

2、 安全点

  如果为每一条指令都生成对应的Oopmap,会需要大量的额外空间,GC成本增高。其实HotSpot虚拟机并不是在为每条指令都生成了Oopmap,程序执行时也并非在任何地方都能停下来开始GC,只能到达特定位置才能开始记录,这些特定位置称为安全点(Safepoint)。

  安全点的选择:是否具有让程序长时间执行的特征(比如:方法调用,循环跳转,异常跳转等)。

  在GC发生时如何让所有线程跑到最近的安全点再停止有二种方案:

  1、抢先式中断:不需要线程的执行代码主动去配合,在GC发生时,首先把所有线程全部中断,如果发现有线程中断的地方不在安全点上,就恢复线程,让它“跑”到安全点上。 现在几乎没有虚拟机实现采用抢先式中断来暂停线程从而响应GC事件。

  2、主动式中断:当GC需要中断线程的时候,不直接对线程操作,仅仅简单地设置一个标志,各个线程执行时主动去轮询这个标志,发现中断标志为真时就自己中断挂起。轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方。

 

3、 安全区域

  当程序不执行的时候即没有分配CPU时间,比如:线程处于Sleep状态或Blocked状态,对于这种情况就需要安全区域(Safe Region)来解决。

  安全区域指在一段代码片段中,引用关系不会发生变化。在这个区域的任意地方开始GC都是安全的,或则可以将安全区域看做时扩展过得安全点。

  安全区域工作原理:在线程中执行到安全区域的代码时,首先标识自己已经进入了安全区域,若在这段时间JVM要发起GC时,就不用管标识自己为安全区域状态的线程了。在线程执行完安全区域的代码要离开安全区域时,当前线程要检查当前系统是否已经完成了根节点枚举(或是整个GC过程),若系统已完成则可以离开安全区域;若系统未完成,则它就必须等待直到可以离开安全区域为止。

© 著作权归作者所有

共有 人打赏支持
PrivateO2
粉丝 0
博文 50
码字总数 71101
作品 0
成都
程序员
私信 提问
《深入理解Java虚拟机 JVM高级特性...》核心笔记

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

洋哥6
2015/10/06
1K
0
jvm系列(三):GC算法 垃圾收集器

这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理。 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世...

ityouknow
2017/09/20
0
0
Java 内存区域和GC机制

目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况   Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与...

Lunqi
2015/09/17
192
1
深入学习Java虚拟机——垃圾收集器与内存分配策略

垃圾回收操作的步骤:首先确定对象是否死亡,然后进行回收 1. 如何判断对象是否死亡 1.1 引用计数法 1.引用计数法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引...

江左煤郎
08/10
0
0
【转】Java之 内存区域和GC机制

转自:Leo Chin 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况    Java GC(Garbage Collection,垃圾收集,垃圾回收...

rayner
2016/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
42分钟前
2
0
Docker搭建代码质量检测平台-SonarQube(中文版)

Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言...

Jacktanger
48分钟前
2
0
Windows / Linux / MacOS 设置代理上网的方法汇总

本文汇总了 Windows / Linux / MacOS 设置代理上网的各种方法,总结如下: 1、设置系统代理(Windows、Linux、MacOS) 2、设置代理插件(Chrome、Chromium、Firefox、Opera、QQ等浏览器) 3、...

sunboy2050
昨天
4
0
自定义 Maven 的 repositories

有时,应用中需要一些比较新的依赖,而这些依赖并没有正式发布,还是处于milestone或者是snapshot阶段,并不能从中央仓库或者镜像站上下载到。此时,就需要 自定义Maven的<repositories>。 ...

waylau
昨天
3
0
徒手写一个es6代码库

mkdir democd demonpm initnpm install -g babelnpm install -g babel-clinpm install --save-dev babel-preset-es2015-node5 在项目目录创建两个文件夹 functional-playground ......

lilugirl
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部