http://www.taobaotest.com/blogs/2294
在性能测试过程中,FULL GC频繁是比较常见的问题,FULL GC 产生的原因有很多,这里主要针对meta压测过程中分析FULL GC问题的一些思路进行分享,供大家参考
1.如何发现是否发生FULL GC和FULL GC是否频繁
使用JDK自带的轻量级小工具jstat
语法结构:
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
参数解释:
Options — 选项,我们一般使用 -gcutil 查看gc情况
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次
比如 /opt/taobao/java/bin/jstat –gcutil pid 5000
输出结果:
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 90.63 100.00 58.82 3.51 183 2.059 0 0.000 2.059
0.00 15.48 7.80 60.99 3.51 185 2.092 1 0.305 2.397
0.00 15.48 18.10 47.90 3.51 185 2.092 2 0.348 2.440
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
通过FGC我们可以发现系统是否发生FULL GC和FULL GC的频率
2. FULL GC分析和问题定位
a. GC log收集和分析
(1)在JVM启动参数增加:"-verbose:gc -Xloggc:<file_name> -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
PrintGCTimeStamp只能获得相对时间,建议使用PrintGCDateStamps获得full gc 发生的绝对时间
(2)如果采用CMS GC,仔细分析jstat FGC输出和GC 日志会发现, CMS的每个并发GC周期则有两个stop-the-world阶段——initial mark与final re-mark,使得CMS的每个并发GC周期总共会更新full GC计数器两次,initial mark与final re-mark各一次
b. Dump JVM 内存快照
/opt/taobao/java/bin/jmap -dump:format=b,file=dump.bin pid
这里有一个问题是什么时候进行dump?
一种方法是前面提到的用jstat工具观察,当OLD区到达比较高的比例如60%,一般会很快触发一次FULL GC,可以进行一次DUMP,在FULL GC发生以后再DUMP一次,这样比较就可以发现到底是哪些对象导致不停的FULL GC
另外一种方法是通过配置JVM参数
-XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC分别用于指定在full GC之前与之后生成heap dump
c. 利用MAT((Memory Analyzer Tool)工具分析dump文件
关于MAT具体使用方法网上有很多介绍,这里不做详细展开,这里需要注意的是:
(1) MAT缺省只分析reachable的对象,unreachable的对象(将被收集掉的对象)被忽略,而分析FULL GC频繁原因时unreachable object也应该同时被重点关注。如果要显示unreachable的对象细节必须用mat 1.1以上版本并且打开选项“keep unreachable object”
(2) 通常dump文件会好几个G,无法在windows上直接进行分析,我们可以先把dump文件在linux上进行分析,再把分析好的文件拷贝到windows上,在windows上用MAT打开分析文件。
相关推荐
在本篇文章中,我们将分享一个 Full GC 问题排查过程,通过示例代码和实际操作,介绍了如何快速定位 Full GC 问题的原因和解决方案。 问题描述 在我们的服务中,突然出现了频繁的 Full GC 问题,而服务本身没有...
5. **垃圾收集器效率评估**:通过对GC日志的深入分析,GChisto可以帮助评估垃圾收集器的效率,如果发现存在频繁的Full GC或者内存泄漏,可以据此调整垃圾收集策略。 使用GChisto时,你需要首先获取应用程序的GC日志...
垃圾回收机制可以分为两种:部分收集(Partial GC)和整堆收集(Full GC)。部分收集可以进一步分为新生代收集(Minor GC)和老年代收集(Major GC)。混合收集(Mixed GC)是对整个新生代和部分老年代进行垃圾回收...
- **减少大对象的创建**:大对象直接进入老年代,过多的大对象可能导致频繁的Full GC。 - **合理使用集合**:避免过度增长的集合,及时清理不再使用的元素。 - **关注长生命周期对象**:如果某些对象生命周期过长...
由于无法直接访问,我们可以假设博主可能讨论了JVM内存的分配策略、垃圾收集算法(如Minor GC、Major GC、Full GC)、内存泄漏检测以及如何通过工具(如VisualVM、JProfiler)进行内存分析和性能调优。 标签 "源码...
在Java 8之前,区分新生代(Minor GC/Young GC)、老年代(Major GC/Old GC)和全堆(Full GC)的收集。Java 8后引入了混合收集(Mixed GC),更智能地处理不同区域的垃圾回收。 ### 垃圾回收算法 1. **标记-清除*...
通过分析这些日志,开发者可以识别出可能导致性能下降的问题,如频繁的Full GC,进而调整堆内存大小或使用其他内存管理策略。 总的来说,JAVA性能调优是一个涉及到多个层面的复杂过程,包括代码优化、内存管理和...
8. **Minor GC与Full GC**: - **Minor GC(YGC)**:发生在新生代,当Eden区满时触发。 - **Full GC**:发生在老年代,当堆内存不足或系统要求时触发。 9. **内存调试工具**: - **jmap**:查看堆内存详细信息...
文章分享了多个调优模式与案例,旨在降低FGC(Full Garbage Collection)频率、减少FGC造成的暂停时间、降低YGC(Young Generation Garbage Collection)频率以及缩短YGC造成的暂停时间。通过调整如...
-XX:+HeapDumpBeforeFullGC可以在FullGC之前导出堆转储文件;-XX:+PrintFlagsFinal可以打印JVM的参数设置。 第三方工具方面,MAT(Memory Analyzer Tool)是一个强大的分析堆转储文件的工具,它可以用来分析内存...
八、Minor GC 与 Full GC * Minor GC:新生代内存不够用时候发生,也叫 YGC。 * Full GC:JVM 内存不够的时候发生。 九、内存调试工具 * jmap:查看内存。 * jstack:可以看当前栈的情况。 * jconsole:用于监控 ...
文件“histo_53.log”可能是内存分析过程中的一个历史记录,包含了对象的分布和数量信息,这在分析内存使用情况时非常有用。在实际操作中,我们需要将其导入到内存分析工具中,以获取更详细的内存占用情况和可能的...
此外,面试者还被问及如何在线上环境中分析GC问题以及JVM的调优方法,包括1.7和1.8版本中JVM内存结构的区别,以及Full GC是否会回收Metaspace空间内存。 数据库方面,面试者遇到了关于锁等待和分布式事务的问题。...
21. **Java内存溢出错误分析**:如何分析和处理常见的内存溢出错误,如Full GC频繁、Old Gen空间不足等。 了解和掌握这些JVM相关知识点对于成为一名优秀的Java开发者至关重要,它们能帮助我们编写更高效、更稳定的...
- **GC Log**: 用于记录垃圾回收的日志信息,通过分析这些日志可以帮助我们理解GC的行为模式及其效率。 - **jstat**: 提供了实时的JVM统计信息,包括堆内存使用情况、GC活动等。 - **jmap**: 用于获取堆内存的快照,...
2. **分析过程**: - 使用JConsole或VisualVM等工具收集系统运行时的信息,包括CPU使用率、内存使用情况等。 - 分析堆内存快照,找出占用内存较大的对象及其类型。 - 考虑是否可以通过调整GC策略、增加堆内存等...
在描述中提到了一个博客链接,虽然具体内容没有提供,但可以推测博主可能分享了关于JVM崩溃的案例分析或解决方案。通常,遇到JVM崩溃时,开发者会查看错误日志来定位问题。在给定的文件名"hs_err_pid26290.log"中,...
- CMS(并发标记清除)回收器主要分为初始标记、并发标记、重新标记和并发清除几个阶段,整个过程中可能会有停顿,且 CMS 会产生内存碎片,如果大量碎片化会导致频繁的 Full GC。 4. **快速排序**: - 快速排序是...
- **垃圾回收问题**:优化JVM的垃圾回收策略,合理设置GC参数,减少Full GC的发生频率。 - **线程死锁**:使用`ThreadMXBean`接口检测线程状态,避免线程间的死锁发生。 - **资源竞争**:优化同步机制,尽可能减少...