文档章节

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

Swimmer
 Swimmer
发布于 2016/12/07 09:15
字数 573
阅读 15
收藏 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
JVM的大管家:自动内存管理机制

和C语言手动管理内存不同,JVM实现了自动内存管理机制,这也是Java语言的一大特点。 简而言之,JVM自动内存管理机制是JVM中面向堆(Heap)的内存管理机制,该机制包括两大部分 为对象分配合适...

登高且赋
2017/12/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

崛起于Springboot2.X之通讯WebSocket(40)

技术简介:Springboot2.0.3+freemaker+websocket 1、添加pom依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

木九天
8分钟前
0
0
Java常用四大线程池用法以及ThreadPoolExecutor详解

为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 在Java中...

孟飞阳
10分钟前
0
0
Netty+Websocket 实现一个简易聊天室

后台代码 /** * 服务端 */public class ChatServer {public static void main(String[] args) throws Exception {int port=8080; //服务端默认端口new ChatServer().bind...

这很耳东先生
12分钟前
1
0
一个本科学生对Linux的认知

我是一名大三的普通一本大学的软件工程的一名学生,学校开设了一些关于系统开发的课程,纸上得来终觉浅,学校的课程课时较短,想要在56个课时之内学会一些公司需要的技能,无疑是纸上谈兵,一...

linuxprobe16
13分钟前
0
0
如何选择开源许可证?

如何为代码选择开源许可证,这是一个问题。 世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPL、BSD、MIT、Mozilla、Apache和LGPL----之中做选择,...

吴伟祥
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部