转自:http://javis163.iteye.com/blog/1679059
当使用CMS收集器时,当开始进行收集时,old代的收集过程如下所示:
1,首先jvm根据-XX:CMSInitiatingOccupancyFraction,-XX:+UseCMSInitiatingOccupancyOnly来决定什么时间开始垃圾收集;
2,如果设置了-XX:+UseCMSInitiatingOccupancyOnly,那么只有当old代占用确实达到了-XX:CMSInitiatingOccupancyFraction参数所设定的比例时才会触发cms gc;
3,如果没有设置-XX:+UseCMSInitiatingOccupancyOnly,那么系统会根据统计数据自行决定什么时候触发cms gc;因此有时会遇到设置了80%比例才cms gc,但是50%时就已经触发了,就是因为这个参数没有设置的原因;
4,当cms gc开始时,首先的阶段是CMS-initial-mark,此阶段是初始标记阶段,是stop the world阶段,因此此阶段标记的对象只是从root集最直接可达的对象;
CMS-initial-mark:961330K(1572864K),指标记时,old代的已用空间和总空间
5,下一个阶段是CMS-concurrent-mark,此阶段是和应用线程并发执行的,所谓并发收集器指的就是这个,主要作用是标记可达的对象
此阶段会打印2条日志:CMS-concurrent-mark-start,CMS-concurrent-mark
6,下一个阶段是CMS-concurrent-preclean,此阶段主要是进行一些预清理,因为标记和应用线程是并发执行的,因此会有些对象的状态在标记后会改变,此阶段正是解决这个问题因为之后的Rescan阶段也会stop the world,为了使暂停的时间尽可能的小,也需要preclean阶段先做一部分工作以节省时间
此阶段会打印2条日志:CMS-concurrent-preclean-start,CMS-concurrent-preclean
7,下一阶段是CMS-concurrent-abortable-preclean阶段,加入此阶段的目的是使cms gc更加可控一些,作用也是执行一些预清理,以减少Rescan阶段造成应用暂停的时间
此阶段涉及几个参数:
-XX:CMSMaxAbortablePrecleanTime:当abortable-preclean阶段执行达到这个时间时才会结束
-XX:CMSScheduleRemarkEdenSizeThreshold(默认2m):控制abortable-preclean阶段什么时候开始执行,
即当eden使用达到此值时,才会开始abortable-preclean阶段
-XX:CMSScheduleRemarkEdenPenetratio(默认50%):控制abortable-preclean阶段什么时候结束执行
此阶段会打印一些日志如下:
CMS-concurrent-abortable-preclean-start,CMS-concurrent-abortable-preclean,
CMS:abort preclean due to time XXX
8,再下一个阶段是第二个stop the world阶段了,即Rescan阶段,此阶段暂停应用线程,对对象进行重新扫描并标记;
YG occupancy:964861K(2403008K),指执行时young代的情况
CMS remark:961330K(1572864K),指执行时old代的情况
此外,还打印出了弱引用处理、类卸载等过程的耗时
9,再下一个阶段是CMS-concurrent-sweep,进行并发的垃圾清理
10,最后是CMS-concurrent-reset,为下一次cms gc重置相关数据结构
11,full gc:
有2种情况会触发full gc,在full gc时,整个应用会暂停
A,concurrent-mode-failure:当cms gc正进行时,此时有新的对象要进行old代,但是old代空间不足造成的
B,promotion-failed:当进行young gc时,有部分young代对象仍然可用,但是S1或S2放不下,因此需要放到old代,但此时old代空间无法容纳此。
影响cms gc时长及触发的参数是以下2个:
-XX:CMSMaxAbortablePrecleanTime=5000
-XX:CMSInitiatingOccupancyFraction=80
解决也是针对这两个参数来的,根本的原因是每次请求消耗的内存量过大
解决方式:
A,针对cms gc的触发阶段,调整-XX:CMSInitiatingOccupancyFraction=50,提早触发cms gc,就可以缓解当old代达到80%,cms gc处理不完,从而造成concurrent mode failure引发full gc
B,修改-XX:CMSMaxAbortablePrecleanTime=500,缩小CMS-concurrent-abortable-preclean阶段的时间
C,考虑到cms gc时不会进行compact,因此加入-XX:+UseCMSCompactAtFullCollection
(cms gc后会进行内存的compact)和-XX:CMSFullGCsBeforeCompaction=4(在full gc4次后会进行compact)参数
转载于:https://my.oschina.net/u/923508/blog/515390
分享到:
相关推荐
3. **Concurrent Mark Sweep (CMS) GC**:这种垃圾回收器尝试并发地执行大部分垃圾回收操作,以减少"Stop-the-world"事件。它适合响应时间敏感的应用。 4. **G1 (Garbage-First) GC**:G1是一种并行和并发的垃圾...
- **Shenandoah GC**:另一个低暂停时间的回收器,特点是并发地处理大部分垃圾回收工作。 4. **GC策略与调优** - **新生代与老年代的比例**:调整这个比例可以影响GC的频率和应用性能。 - **Eden与Survivor空间...
3. CMS (Concurrent Mark Sweep) GC:并发标记清除垃圾回收器,尽可能减少停顿时间,适合对响应时间敏感的应用。 4. G1 (Garbage-First) GC:新一代的垃圾回收器,目标是实现低延迟,通过分区策略和并发模式,使得...
1. Minor GC:发生在年轻代(Young Generation),主要回收Eden区和部分Survivor区的垃圾。 2. Major GC / Full GC:发生在老年代(Tenured Generation),涉及整个堆空间,包括年轻代和老年代。Full GC开销较大,应...
每种收集器有其特点和适用场景,如Serial适合单线程环境,Parallel适合多CPU环境,CMS提供并发回收,G1能实现低暂停时间目标。 5. **内存模型和区域**:JVM内存分为堆(Heap)、栈(Stack)、方法区(Method Area)...
三、垃圾回收器介绍 1. Serial GC:单线程的垃圾回收器,适用于轻量级应用或者低CPU的环境。 2. Parallel GC:多线程版本的Serial GC,可以提高垃圾回收效率。 3. CMS(Concurrent Mark Sweep):并发标记清除,尽量...
JVM的垃圾回收机制是Java性能优化的关键,理解不同阶段和区域的内存分配、选择合适的垃圾收集器以及合理调整参数,可以有效提高系统性能,减少应用停顿时间,从而提升用户体验。对于大型分布式系统,深入理解JVM的GC...
它在应用运行期间进行并发回收,可能导致浮动垃圾。当堆空间不足以满足并发收集期间的应用需求时,会触发"并发模式失败"。通过`-XX:+UseConcMarkSweepGC`开启。设置`-XX:CMSInitiatingOccupancyFraction=<N>`可以...
- **增量/并发垃圾回收(Incremental/Concurrent Marking)**:为了减少垃圾回收期间应用程序的停顿时间,这些算法尝试在多个步骤中完成标记过程,与应用程序线程交错执行,如CMS(Concurrent Mark Sweep)和G1...
垃圾回收是Java性能优化的重要方面,理解各种算法和回收器的工作原理,有助于我们编写出更高效、更稳定的程序。同时,随着JVM技术的不断发展,新的垃圾回收算法和工具也在不断涌现,为开发者提供了更多优化选择。
1. 垃圾回收原理:垃圾回收器会识别并清理不再使用的对象,释放内存资源。主要目标是确保无内存泄漏,并避免应用程序因内存耗尽而崩溃。 2. Java内存模型:Java内存分为堆内存(Heap)、栈内存(Stack)和方法区...
堆内存分为新生代(Young Generation)、老年代(Tenured Generation)和永久代( Perm Generation 或 Metaspace),不同代使用不同的垃圾回收策略。 ### **垃圾回收类型** 1. **Minor GC**:仅清理新生代。 2. **...
JVM的垃圾回收器有多种,如串行GC(Serial GC)、并行GC(Parallel GC)、并发标记扫描GC(CMS, Concurrent Mark Sweep)和G1垃圾收集器等。选择合适的垃圾回收器取决于应用的需求,例如,对于响应时间敏感的应用,...
JVM提供多种垃圾收集器,如串行GC、并行GC、并发Mark Sweep (CMS) 和G1。选择合适的GC策略取决于应用的性能需求,例如响应时间、吞吐量和内存使用。 - **串行GC**:单线程进行垃圾回收,适合轻量级应用。 - **并行...
- 分代收集策略将堆内存分为新生代(Young Generation)和老年代(Tenured Generation),新生代又细分为Eden区和两个Survivor区,这种划分有助于提高垃圾收集效率。 9. **垃圾收集器类型**: - 包括Serial、...
- CMS(Concurrent Mark Sweep):并发标记清除,尽可能减少停顿时间,适合响应时间敏感的应用。 - G1(Garbage-First):并行且跨代的垃圾收集器,旨在最小化暂停时间,适用于大内存应用。 - ZGC(Z Garbage ...
【Java新生代垃圾回收调试详解】 一、引言 Java虚拟机(JVM)的垃圾回收(Garbage Collection, GC)是其核心特性之一,它负责自动管理内存,...对于更复杂的CMS收集器,其涉及更多并发阶段,后续会有更深入的探讨。
- **并发收集器**:如CMS(Concurrent Mark Sweep)和G1(Garbage-First),在应用程序运行时进行部分垃圾回收,减少停顿时间。 **5. 参数调整** JVM调优涉及多个参数,如年轻代和年老代大小 `-Xms` 和 `-Xmx`,...
JVM提供了不同的垃圾收集器,包括串行收集器、并行收集器和并发标记清除(CMS)收集器。 -XX:+UseParallelGC:选择并行收集器,适用于新代(Young Generation)。 -XX:+UseParallelOldGC:选择并行年老代收集器,...
6. **并发收集器**:与应用程序并发执行,尽可能减少停顿时间,如CMS(Concurrent Mark Sweep)收集器。 7. **并行收集器**:多线程并行执行垃圾收集,通常在多核处理器上提高性能,如Parallel GC。 在Sun HotSpot...