转载自 ---- http://www.blogjava.net/killme2008/archive/2009/09/26/296567.html
本以为在上篇定稿的参数后应该能有比较好的表现,然后实际的表现大出我的意料,cms回收触发非常频繁,虽然每次都只是10-50毫秒,但是次数12个
小时内能达到180多次,这显然不正常。通过gc日志和jstat可以看到,每次old区还在5%左右就开始进行CMS,此时的perm区也才30%,这
两个数字有浮动并且CMS触发的时间上也没有规律,在测试环境和生产环境中都是如此。
那么最后是怎么解决的呢?其实没有解决。我只是替换了一个参数就没再发生这个现象,上文提到为了避免System.gc()调用引起的full
gc,使用了jdk6引入的新参数-XX:+ExplicitGCInvokesConcurrent来让System.gc()并发执行,但是测试表明
恰恰是这个参数引起了CMS的频繁发生,去掉这个参数就没有那个奇特的现象。重复检查了代码,并且再次查看了GC日志,没有再发现有
System.gc()的调用,我暂时将原因归结于使用了ExplicitGCInvokesConcurrent参数后其他方法触发了CMS,如果有知
晓的朋友请留言告知,最后的方案还是彻底禁掉了显式GC调用。最终定稿的参数:
-
server
-
Xms1536m
-
Xmx1536m
-
XX:NewSize
=
256m
-
XX:MaxNewSize
=
256m
-
XX:PermSize
=
64m
-
XX:MaxPermSize
=
64m
-
XX:
+
UseConcMarkSweepGC
-
XX:
+
UseCMSCompactAtFullCollection
-
XX:CMSInitiatingOccupancyFraction
=
70
-
XX:
+
CMSParallelRemarkEnabled
-
XX:SoftRefLRUPolicyMSPerMB
=
0
-
XX:
+
CMSClassUnloadingEnabled
-
XX:
+
DisableExplicitGC
-
XX:SurvivorRatio
=
8
删除了+CMSPermGenSweepingEnabled,这个参数在jdk6上跟
-
XX:
+
CMSClassUnloadingEnabled
作用重叠了,如果你还跑在jdk5上面,那么应该使用这个参数。救助空间设置为NewSize的1/10,也就是25M左右,让年轻代尽量回收,防止年轻
对象跑到年老代过早触发CMS甚至full gc。CMS的触发阀值下降到70%,因为年老代增长较慢,宁愿回收次数多一点,降低长暂停的可能。
24小时内的某台生产机器的表现,通过jstat观察:
S0 S1 E O P YGC YGCT FGC FGCT GCT
39.70
0.00
5.59
15.15
28.99
20260
326.041
14
0.592
326.633
39.70
0.00
65.49
15.15
28.99
20260
326.041
14
0.592
326.633
0.00
36.93
19.37
15.16
29.01
20261
326.059
14
0.592
326.650
0.00
36.93
93.23
15.16
29.01
20261
326.059
14
0.592
326.650
34.04
0.00
59.62
15.17
29.01
20262
326.076
14
0.592
326.668
0.00
38.55
12.76
15.19
29.01
20263
326.094
14
0.592
326.686
0.00
38.55
65.48
15.19
29.01
20263
326.094
14
0.592
326.686
CMS两次暂停时间总和在100ms以下,minor gc平均一次执行花了16ms,平均3-4秒发生一次。暂时来看还不错,也许还可以适当调小一下NewSize,加快以下minor gc。
此次调整总共花了大概一周多的时间,由于经验不足,还是走了不少弯路,幸好最终的结果还可以,也让自己对cms
gc有比较深入的了解。我们的系统在周4晚上已经全部更新上线,从内部测试、压测、日常测试、beta测试以来,每个阶段都发现几个隐蔽的问题,在上线后
暂时没有再发现问题,证明这个流程还是很有意义的,我过去对流程充满偏见,现在看来是可笑的。总结我在淘宝5个月越来学习到的东西,几个关键词:认真、负
责、细心、快乐。
分享到:
相关推荐
根据不同的应用场景,JVM提供了多种垃圾回收算法,包括串行GC、并行GC、并发标记清除(CMS)GC和G1 GC等。每种算法有不同的特点和适用场景。例如,串行GC适合单核处理器和小规模应用,而并行GC适合多核处理器和大...
- CMS(Concurrent Mark Sweep)GC:并行标记,低延迟,适用于响应时间敏感的应用。 - G1(Garbage-First)GC:新一代的垃圾收集器,目标是达到可预测的暂停时间。 4. GC调优 调优主要涉及选择合适的垃圾收集器...
本文将从 JVM 和 GC 相关参数、问题解决过程、排除应用程序的内存使用问题、排除 Cache 内容过多的问题、调整 GC 时间点、调整对象在年轻代内存中驻留的时间、CMS Remark之前强制进行年轻代的 GC 等几个方面详细介绍...
例如,调整新生代和老年代的比例,选择合适的垃圾收集器(如Serial GC、Parallel GC、CMS GC、G1 GC等),以及设置适当的内存大小和暂停时间目标等,都是GC调优的重要方面。 在备考GC程序员考试时,考生需要掌握...
此外,监控GC日志,分析GC行为,以及使用适当的GC算法(如CMS、G1或ZGC)也是优化过程中的关键步骤。通过这些实践,开发者能够确保Java应用程序在运行时具有良好的内存管理和高效的资源利用率。
2. **GC日志分析**:通过分析GC日志,了解GC行为,找出性能瓶颈。 3. **并行与并发设置**:调整并行GC线程数和并发GC策略,优化性能。 4. **对象存活率预估**:通过调整Survivor区比例,减少Full GC的发生。 5. **...
**JVM参数调整**:通过设置JVM参数可以影响GC行为,如`-Xms`和`-Xmx`控制堆内存大小,`-XX:NewRatio`设置新生代与老年代的比例,`-XX:MaxPermSize`或`-XX:MetaspaceSize`控制方法区大小,`-XX:+UseConcMarkSweepGC`...
2. **GC的工作原理**:包括不同类型的垃圾收集器,如Serial、Parallel、CMS(并发标记扫描)和G1(垃圾优先)等,它们如何检测和回收内存。 3. **GC的生命周期**:了解对象从创建到被垃圾收集的过程,包括新生代、...
2. **并行GC(Parallel GC)**:也称为吞吐量优先GC,它在多线程环境中运行,提高了GC效率,减少了整体运行时间,但STW仍然存在。 3. **并发标记GC(Concurrent Mark Sweep, CMS)**:CMS旨在减少STW的时间,它将大...
6. **并行与并发调整**:根据系统硬件资源调整并行GC的线程数(`-XX:ParallelGCThreads`),以及并发GC的并发程度(`-XX:ConcGCThreads`),以达到最佳性能。 7. **类加载器管理**:类加载器的不当使用可能导致内存...
在Java世界中,JVM(Java虚拟机)是运行所有Java应用程序的核心,它负责解析字节码、管理内存以及执行线程。...通过实践和研究GC算法及种类,开发者能更有效地管理内存,使Java应用程序运行更加高效。
- 调整GC参数:例如,CMS中的`-XX:CMSInitiatingOccupancyFraction`用来设置触发CMS的阈值。 - 监控GC状态:使用JVisualVM、JConsole等工具监控GC性能,分析GC日志,找出问题。 GC工具方面,JDK自带了一些工具帮助...
2. **可视化展示**:通过图表展示GC活动的趋势,例如GC次数随时间的变化、不同代别的内存使用情况等,使问题更容易被发现。 3. **性能指标**:计算和展示关键性能指标,如平均GC暂停时间、吞吐量、垃圾收集器的效率...
2. **GC日志分析**:分析GC日志是理解其行为的关键。日志包含了每次GC事件的时间、持续时间、内存区域的变化等信息。工具如`MAT (Memory Analyzer Tool)`和`GCPROFILES`可以帮助解析这些日志,找出可能导致性能问题...
2. **内存分配与收集策略**:GC-PowerStation可能提供了内存分配策略的调整选项,如新生代和老年代的比例,以及eden、survivor区的大小等,这些策略会影响垃圾收集的频率和性能。 3. **性能监控与调优**:该工具...
JVM提供了多种垃圾回收器供选择,如Serial GC、Parallel GC、CMS GC等。开发者可以根据应用的特点选择合适的垃圾回收器,并通过JVM参数进行配置,以达到提升性能的目的。 最后,手册强调,在生产环境中应用JVM参数...
7. **GC选择和自动调整** (2 Ergonomics .png & 5 Available Collectors .png) - Java的默认行为是自动选择合适的垃圾收集器,但开发者可以根据应用特点手动选择,如串行、并行、CMS或G1。JVM的自我调优机制...
2. **GC算法**:介绍常用的垃圾收集算法,如Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage-First)等,分析它们的特点和适用场景。 3. **内存区域和大小配置**:讨论堆内存的结构,如Eden区、...
4. **并发模式**:CMS和G1等GC支持并发收集,可以通过`-XX:ParallelGCThreads`等参数调整并发线程数,减少应用暂停时间。 5. **GC日志分析**:开启GC日志,通过`-XX:+PrintGCDetails`和`-XX:+PrintGCDateStamps`等...
2. **垃圾收集器类型**:Java中有多种GC实现,如Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)、G1(Garbage First)和ZGC(Z Garbage Collector)。每种都有其特定的设计目标和适用场景,比如Serial适合轻...