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做一些清理工作。
相关推荐
【HotSpot GC官网文档截图 - 20200917】是一个珍贵的资源集合,包含了一系列关于Java HotSpot虚拟机(JVM)垃圾收集器(GC)的官方文档截图。这些截图详细介绍了GC的发展历程、不同版本的特性、选择GC的策略以及调优...
### Sun Hotspot V1.6.0 JVM GC详解 #### 一、JVM结构与GC基础知识 ##### 1.1 JVM内存结构概述 Java虚拟机(JVM)内存主要分为以下几个部分: - **程序计数器(PC Register)**:记录当前线程所执行的字节码指令...
【Java HotSpot VM Serial GC详解】 HotSpot VM的Serial GC是一种单线程的垃圾收集器,主要用于新生代的垃圾回收,特别适用于轻量级和低内存的环境。在这个话题中,我们将深入探讨Serial GC在新生代(Young ...
2. 老年代GC(Major GC 或 Full GC) 老年代GC处理的是长期存活的对象,使用标记-整理或标记-压缩算法。当老年代空间不足或系统请求Full GC时,会执行此操作。Full GC开销大,应尽量避免频繁触发。 3. 垃圾收集器 ...
3. **垃圾回收(GC)**:Hotspot虚拟机实现了多种垃圾回收算法,如串行GC、并行GC、CMS和G1等。理解GC的工作原理、触发条件以及如何调整GC参数,能帮助解决内存管理和性能问题。 4. **内存模型**:了解Java内存模型...
HotSpot虚拟机提供了多种GC算法,如串行GC、并行GC、并发标记清除(CMS)和G1垃圾收集器。每种GC策略都有其适用场景和优缺点。 3. **新生代与老年代**:HotSpot虚拟机将堆内存划分为新生代(Young Generation)和老...
在问题排查时,可以使用`jmap -heap [pid]`等工具监控内存状态,以及`-XX:+PrintGCDetails`等选项输出GC日志,以便分析和优化。 总结来说,理解JDK 1.6的GC机制对于优化Java应用程序的性能至关重要。通过了解内存...
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 的出现。
3. **监控并分析 GC 日志**:定期查看 GC 日志,分析是否有频繁的 Full GC 或者长时间的 GC 暂停,据此调整相关参数。 4. **优化线程池配置**:合理配置线程池的最大线程数、核心线程数等参数,以平衡 CPU 使用率...
2. **并行GC(Parallel GC)**:与串行GC相比,它在多处理器机器上通过使用多个线程进行垃圾收集,从而显著提高了GC速度。然而,Stop-The-World事件仍然存在,可能导致应用暂停时间较长。 3. **并发标记GC...
介绍Sun HotSpot和JRockit JVM堆内存输出和分析工具,经典GC策略原理等。
4. **垃圾收集器类型**:HotSpot提供了多种GC策略,如Serial GC、Parallel GC、Parallel Old GC、CMS(Concurrent Mark Sweep)、G1(Garbage-First)和ZGC(Zing Concurrent Low Latency Collector)。每种收集器有...
- Full GC:针对年轻代、老年代以及永久代的全面垃圾收集操作。 #### 五、垃圾回收器概览 Sun HotSpot JVM提供了多种垃圾回收器,适用于不同的应用场景: 1. **Serial Collector** - 串行收集器,简单高效,...
3. **监控和分析**:使用JVisualVM、Visual GC等工具监控应用运行时的GC行为,通过分析GC日志来确定最佳配置。例如,频繁的Full GC可能是由于对象存活时间过长导致,可以通过调整年轻代大小或采用更合适的垃圾回收...
性能分析是性能工程中的关键步骤之一,它涉及到监测系统被测对象的资源利用情况、锁定状态以及其他相关指标,并通过这些数据来评估系统的整体性能。 1. **监测**:包括系统资源利用率、锁统计等。 2. **日志分析**...
Hotspot源码的分析有助于开发者深入理解Java性能优化、内存管理以及垃圾收集机制。 首先,让我们探讨一下JVM。Java虚拟机是Java平台的核心组成部分,它为Java程序提供了一个跨平台的运行环境。Hotspot JVM是Oracle ...
常见的垃圾收集器有串行GC、并行GC、并发标记清除GC(CMS)、G1 GC以及ZGC等。每种GC有其适用场景和特点,例如串行GC适用于轻量级应用,而并发标记清除GC适合多核CPU的大内存应用。 GC调优涉及多个方面:选择合适的...
在这个版本中,HotSpot JVM提供了多种垃圾回收(GC)算法,每种算法都有其特定的适用场景和参数调整策略。下面将详细讨论JDK9中的主要GC类型、相关参数以及调优策略。 1. **GC类型与启用参数**: - **Serial GC**...