`
LeafInWind
  • 浏览: 2706 次
  • 性别: Icon_minigender_1
  • 来自: 埃及
文章分类
社区版块
存档分类
最新评论

hotspot串行GC之full gc分析

 
阅读更多

1.概述

hotspot串行GC之full gc主要包括四个步骤,依次是:

1.从根引用出发,标记所有可达对象(如图灰色部分)


 

2.为每个可达对象计算full gc后将移动到的新位置(图中虚线框其实与contigCompatableSpace是重叠的,分开只是为了更加清晰)


 

3.将根引用以及所有可达对象中的oop字段修改为指向第二步中计算出的新位置(实线箭头修改为双实线箭头)


 

4.将所有可达对象移动到第二步中计算出的新位置


 

2.伪代码

http://leafinwind.iteye.com/blog/2013687

 

phase1的关键之处在于依靠一个stack来遍历根引用的所有可达对象。

 

phase2有两个很精妙的地方,首先是对space从bottom开始的连续的活对象,清除了这些对象的gc_mark标记已经forward字段,因为这些对象最终并不需要移动,space的_first_dead记录了第一个死对象的地址;第二是对连续的死对象,将其中第一个死对象的forward字段置为了右端最近的活对象地址,这样后续的phase3和phase4就可以跳过对这片连续死对象区域的扫描。

 

phase3遍历所有活对象,将它们的oop字段都修改为第二步中计算出的新位置。这里需要说明的是对[bottom,_first_dead)区间的特殊处理,因为其中的对象在第二步中已经清除gc_mark了。

 

phase4遍历所有活对象,将它们移动到新的位置。注意处理过程[bottom,_first_dead->forwardee())区间都可以跳过。

 

3.与hotspot代码的对应关系

phase1对应hotspot代码的GenMarkSweep::mark_sweep_phase1方法

调用gch->gen_process_strong_roots处理根引用,使用的follow_root_closure是一个FollowRootClosure,其do_oop方法在mark当前根引用指向对象的同时,还会将该对象中的所有oop字段压入一个栈中(见MarkSweep::mark_and_push方法),然后从“右侧”深度优先的mark所有间接引用的对象,直到栈为空。

 

phase2对应GenMarkSweep::mark_sweep_phase2(),要点在伪代码中都已提到,不同之处主要在于:

1.伪代码只用了一个space,而hotspot是三个:依次遍历old gen,eden和from中的对象,将它们的forward地址首先置为old gen中的地址,填满后则依次再使用eden和from。注意这里的一个暗含的意思是full gc会将young gen中的对象直接拷入old gen,与对象年龄什么的都没有关系,并且很可能一次full gc后young gen会被清空。

2.为尽量在old gen的开头获得一片连续的活对象区间,hotspot在一定的设置下允许将部分死对象初始化为无意义的对象填充进去。

 

phase3对应GenMarkSweep::mark_sweep_phase3。

 

phase4对应GenMarkSweep::mark_sweep_phase4(),与伪代码的不同也在于hotspot有三个space。另外如果eden和from中的对象都拷入了old gen,那么它们的compact_top指针会等于bottom指针,这时会对相应space做一些清理工作。

 

 

  • 描述: phase1
  • 大小: 26.1 KB
  • 描述: phase2
  • 大小: 29.5 KB
  • 描述: phase3
  • 大小: 35.5 KB
  • 描述: phase4
  • 大小: 25.2 KB
分享到:
评论
2 楼 LeafInWind 2014-03-04  
tracybryant 写道
mark_phase1中使用的stack是新创建的吗?与copyingGC中的隐式队列不一样是吗?我觉得如果是创建的stack就没有什么巧妙的。希望指点。

是新创建的,不是隐式的。的确算不上巧妙。
1 楼 tracybryant 2014-03-04  
mark_phase1中使用的stack是新创建的吗?与copyingGC中的隐式队列不一样是吗?我觉得如果是创建的stack就没有什么巧妙的。希望指点。

相关推荐

    HotSpot GC官网文档截图 - 20200917

    【HotSpot GC官网文档截图 - 20200917】是一个珍贵的资源集合,包含了一系列关于Java HotSpot虚拟机(JVM)垃圾收集器(GC)的官方文档截图。这些截图详细介绍了GC的发展历程、不同版本的特性、选择GC的策略以及调优...

    Sun Hotspot V1.6.0 JVM GC PPT.pdf

    ### Sun Hotspot V1.6.0 JVM GC详解 #### 一、JVM结构与GC基础知识 ##### 1.1 JVM内存结构概述 Java虚拟机(JVM)内存主要分为以下几个部分: - **程序计数器(PC Register)**:记录当前线程所执行的字节码指令...

    hllvm.HotSpot VM Serial GC的一个问题1

    【Java HotSpot VM Serial GC详解】 HotSpot VM的Serial GC是一种单线程的垃圾收集器,主要用于新生代的垃圾回收,特别适用于轻量级和低内存的环境。在这个话题中,我们将深入探讨Serial GC在新生代(Young ...

    jvm 参数及gc详解

    2. 老年代GC(Major GC 或 Full GC) 老年代GC处理的是长期存活的对象,使用标记-整理或标记-压缩算法。当老年代空间不足或系统请求Full GC时,会执行此操作。Full GC开销大,应尽量避免频繁触发。 3. 垃圾收集器 ...

    hotspot1.7.rar

    3. **垃圾回收(GC)**:Hotspot虚拟机实现了多种垃圾回收算法,如串行GC、并行GC、CMS和G1等。理解GC的工作原理、触发条件以及如何调整GC参数,能帮助解决内存管理和性能问题。 4. **内存模型**:了解Java内存模型...

    翻译《Memory Management in the Java HotSpot™ Virtual Machine》

    HotSpot虚拟机提供了多种GC算法,如串行GC、并行GC、并发标记清除(CMS)和G1垃圾收集器。每种GC策略都有其适用场景和优缺点。 3. **新生代与老年代**:HotSpot虚拟机将堆内存划分为新生代(Young Generation)和老...

    jdk 1.6 gc详解

    在问题排查时,可以使用`jmap -heap [pid]`等工具监控内存状态,以及`-XX:+PrintGCDetails`等选项输出GC日志,以便分析和优化。 总结来说,理解JDK 1.6的GC机制对于优化Java应用程序的性能至关重要。通过了解内存...

    hotspot 源码(JDK8)

    Hotspot的GC策略包括Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1。JDK8中,CMS是默认的并行旧代收集器,而G1则是新生代和老年代都采用并发收集的新生代选择。理解这些GC的工作原理和调优参数,对于解决...

    Java full gc触发情况实例解析

    Java Full GC 触发情况实例解析 Java Full GC 触发情况实例解析主要介绍了 ...Java full gc 触发情况实例解析是非常复杂的,需要我们认真地学习和分析,以便更好地理解 Java 的垃圾收集机制和避免 Full GC 的出现。

    HotSpot实战

    3. **监控并分析 GC 日志**:定期查看 GC 日志,分析是否有频繁的 Full GC 或者长时间的 GC 暂停,据此调整相关参数。 4. **优化线程池配置**:合理配置线程池的最大线程数、核心线程数等参数,以平衡 CPU 使用率...

    hotspot-virtual-machine-garbage-collection-tuning-guide.pdf

    2. **并行GC(Parallel GC)**:与串行GC相比,它在多处理器机器上通过使用多个线程进行垃圾收集,从而显著提高了GC速度。然而,Stop-The-World事件仍然存在,可能导致应用暂停时间较长。 3. **并发标记GC...

    jdk20-hotspot-virtual-machine-garbage-collection-tuni

    4. **垃圾收集器类型**:HotSpot提供了多种GC策略,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)、G1(Garbage-First)和ZGC(Zing Concurrent Low Latency Collector)。每种收集器有...

    JVM_GC调优

    - Full GC:针对年轻代、老年代以及永久代的全面垃圾收集操作。 #### 五、垃圾回收器概览 Sun HotSpot JVM提供了多种垃圾回收器,适用于不同的应用场景: 1. **Serial Collector** - 串行收集器,简单高效,...

    Java_GC垃圾回收调优指南

    3. **监控和分析**:使用JVisualVM、Visual GC等工具监控应用运行时的GC行为,通过分析GC日志来确定最佳配置。例如,频繁的Full GC可能是由于对象存活时间过长导致,可以通过调整年轻代大小或采用更合适的垃圾回收...

    性能工程师指南:玩转OpenJDK HotSpot垃圾收集器

    性能分析是性能工程中的关键步骤之一,它涉及到监测系统被测对象的资源利用情况、锁定状态以及其他相关指标,并通过这些数据来评估系统的整体性能。 1. **监测**:包括系统资源利用率、锁统计等。 2. **日志分析**...

    JDK10(JDK10底层C++源码及hotspot虚拟机源码)

    JDK10的G1 Full GC并行化是HotSpot的一个重要改进。 3. **内存模型(Memory Model)**:HotSpot虚拟机实现了Java内存模型,确保多线程环境下数据的一致性和可见性。 4. **类加载机制(Class Loading)**:HotSpot...

    Hotspot源码

    Hotspot源码的分析有助于开发者深入理解Java性能优化、内存管理以及垃圾收集机制。 首先,让我们探讨一下JVM。Java虚拟机是Java平台的核心组成部分,它为Java程序提供了一个跨平台的运行环境。Hotspot JVM是Oracle ...

    JVM体系结构与GC调优

    常见的垃圾收集器有串行GC、并行GC、并发标记清除GC(CMS)、G1 GC以及ZGC等。每种GC有其适用场景和特点,例如串行GC适用于轻量级应用,而并发标记清除GC适合多核CPU的大内存应用。 GC调优涉及多个方面:选择合适的...

Global site tag (gtag.js) - Google Analytics