`

JVM的GC日志

阅读更多

http://www.importnew.com/15722.html (在运行时开启GC日志)

 

 

 

 

我们经常会遇到JVM运行时出错的情况。若能在启动时加入一些启动选项(startup option),便可以获取与bug相关的重要线索,从而有希望根治它们。但在实际操作时,我们总是忘记添加-XX:+HeapDumpOnOutOfMemoryError 或 -XX:+PrintGCDetails这样必要的flag。

每当面对如此窘境,我们只能关闭JVM,修改启动参数(startup parameter),然后默默祈祷,希望问题场景(problematic situation)能在重启之后得以重现。这种方法偶尔奏效,在场景重现后你或许还能收集到足够的证据,以便动手根治潜在的问题。

不难看出,前文所述的方法问题显著——你必须执行一次额外的重启才能加入那烦人的debug选项,而不能借助中断(outage)实现。事实上,JDK bundle提供了一种可行的变通方案,如果将之收入麾下,偶尔还能从中获益。

jinfo

在JDK bundle中隐藏着一个精悍的小工具——jinfo。作为一个命令行工具,jinfo用于收集正在运行的Java进程的配置信息。jinfo吸引眼球的地方在于,它能通过-flag选项动态修改指定的Java进程中的某些JVM flag的值。虽然这样的flag数量有限,但它们偶尔能够帮助到你。通过以下的命令你便能看到JVM中哪些flag可以被jinfo动态修改:

1
2
3
4
5
6
7
8
9
10
11
my-precious me$ java -XX:+PrintFlagsFinal -version|grep manageable
     intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
     intx CMSWaitDuration                           = 2000                                {manageable}
     bool HeapDumpAfterFullGC                       = false                               {manageable}
     bool HeapDumpBeforeFullGC                      = false                               {manageable}
     bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
     ... cut for brevity ...
     bool PrintGC                                   = false                               {manageable}
     bool PrintGCDateStamps                         = false                               {manageable}
     bool PrintGCDetails                            = false                               {manageable}
     bool PrintGCTimeStamps                         = false                               {manageable}

通过选项-XX:+PrintFlagsFinal可以列出所有的JVM flag,而其中的标注为manageable 的flag则是值得我们关注的部分。这些flag可通过JDK management interface(-XX:+PrintFlagsFinal)动态修改。虽然在JConsole中也能查到与其十分相似的MBean。但在我看来,以命令行的方式查看它们更加的便捷。

如何使用jinfo

让我们通过实战来学习如何使用jinfo。在下面的例子中,我们将在一个正在运行的JVM中动态开启GC日志功能:

1
2
3
4
5
6
7
my-precious me$ jps
12278 HighAllocationRate
12279 Jps
12269 JConsole
my-precious me$ jinfo -flag +PrintGCDetails 12278
my-precious me$ jinfo -flag +PrintGC 12278
my-precious me$

在jinfo中需要打开-XX:+PrintGC和 -XX:+PrintGCDetails两个选项才能开启GC日志,这与用命令行参数的方式实现有着细微的差别——如果你通过启动脚本(startup script)来设置参数,仅需-XX:+PrintGCDetails即可,因为-XX:+PrintGC会被自动打开。

不过,从standard output的结果来看,PID为12278的进程的GC日志的确能够滚动地显示出来:

1
2
3
4
5
...
[GC (Allocation Failure) [PSYoungGen: 876416K->102624K(909312K)] 1094420K->320820K(1161216K), 0.2173131 secs] [Times: user=0.74 sys=0.00, real=0.22 secs]
...
[GC (Allocation Failure) [PSYoungGen: 890304K->102240K(917504K)] 1108924K->320956K(1169408K), 0.2446639 secs] [Times: user=0.82 sys=0.01, real=0.25 secs]
...

同理,若想关闭GC日志功能,只需要执行jinfo -flag -PrintGCDetails 12278和 jinfo -flag -PrintGC 12278命令即可。

在我看来,学会使用jinfo,只能让你在故障排除的工作中少花一到两天的时间。若打一开始就使用Plumbr这类性能监控工具,你可能从未有过这样的烦恼。

分享到:
评论

相关推荐

    jvmgc日志分析工具

    "jvmgc日志分析工具"专为解析和可视化JVM生成的GC日志而设计,帮助开发者识别内存瓶颈,调整内存设置,以及诊断可能的性能问题。 GC日志是JVM在运行过程中记录的关于垃圾收集活动的详细信息,包括垃圾收集的起始...

    JVM 输出 GC 日志导致 JVM 卡住

    JVM 输出 GC 日志导致 JVM 卡住 JVM 输出 GC 日志导致 JVM 卡住是一个常见的问题,尤其是在高并发和高性能应用中。这个问题的根源在于 JVM 的垃圾回收机制(Garbage Collection,GC),它会在 JVM 运行时周期性地...

    gcview 容错性较hpjmeter强的jvm gc日志分析工具

    虽然功能叫hpjmeter简单,界面也不咋地 不过容错性要比hpjmeter强很多,虽然快照中所有性能指标都挤在一起,但是很直观 总体来说比较强悍,特收金币一枚...

    JVM内存日志

    在开发和优化Java应用程序时,理解JVM内存日志至关重要,因为它可以帮助我们诊断性能问题,例如内存泄漏或过度的垃圾收集。`jmap`是Java的一个命令行工具,用于获取堆内存的详细信息,包括堆dump,这对于分析JVM内存...

    jvm gc

    通过这些工具,我们可以观察GC日志,分析GC性能,找出可能的问题。 7. **垃圾收集器组合**:JDK 11引入了ZGC(Z Garbage Collector),这是一种低延迟的GC,目标是在大堆上实现几乎无暂停时间的垃圾收集。JDK 14...

    java应用JVM的GC频率观察方法

    1. 在开发和测试环境下,可以通过配置JVM参数来输出GC日志。例如,添加`-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime`参数,可以详细记录GC事件,包括简要信息、...

    jvm和gc详解及调优

    5. **GC调优**:包括如何分析GC日志,理解GC停顿(Stop-the-World)事件,以及如何通过调整JVM参数来改善系统性能,如设置堆大小、新生代与老年代的比例、存活代的晋升策略等。 6. **性能监控与诊断工具**:如...

    用于测试jvm gc调优-share-jvm-gc.zip

    1. **JVM参数设置**:根据应用需求,设置合适的JVM启动参数,如堆大小(`-Xms`和`-Xmx`)、新生代与老年代的比例(`-XX:NewRatio`)、Eden区与Survivor区的比例(`-XX:SurvivorRatio`)、GC日志输出(`-XX:+...

    GCViewer-FullGC分析工具

    1. **日志解析**:GCViewer能够处理标准的JVM GC日志格式,通过解析这些日志,将复杂的内存和时间数据转化为可读性强的图形化展示。 2. **内存区域可视化**:GCViewer能分别显示堆内存、年轻代(包括Eden区、...

    IBM JVM GC 技术文档

    - **详细的GC日志**:IBM JVM支持输出详细的GC日志信息,帮助开发者监控和调试GC行为。 - GC日志可以包括从`System.gc()`调用触发的收集、分配失败时的收集、堆扩展或收缩时的收集等信息。 #### 六、消息与命令行...

    jvm gc jvm调优 查看工具

    它提供了CPU和内存使用情况的实时视图,还可以分析线程、监视类加载、JVM配置、GC日志等。通过JavaVisualVM.rar文件,用户可以安装并使用这个强大的工具。 另一个是com-sun-tools-visualvm-modules-visualgc.rar,...

    实战Hot Spot JVM GC

    在GC监控方面,除了使用JMX参数外,还可以使用-Xloggc:文件参数来记录GC日志,并通过-XX:+PrintGCDetails等参数打印GC的详细信息。 优化建议包括合理设置堆内存大小,选择合适的垃圾回收器,调整新生代与老年代的...

    jvm 参数及gc详解

    调优主要涉及选择合适的垃圾收集器,调整堆大小和新生代比例,以及设置GC日志,通过监控GC行为来优化性能。 总结,理解并掌握JVM参数和GC机制是Java开发中的重要技能。通过合理配置JVM参数,我们可以有效控制内存...

    JVM GC原理, heapsize调优

    诊断这类问题时,首先要确认是否选择了合适的GC策略,其次要检查堆内存的大小设置是否恰当,最后还要分析具体的应用行为和垃圾回收日志,识别出是哪种类型的问题,比如内存泄露、对象分配过快等。 6. 使用IBM JDK的...

    jvm gc分析工具gcviewer-1.36.jar

    对gc日志进行统计分析,使用命令:java -jar gcviewer-1.3x.jar gc.log summary.csv [chart.png] [-t PLAIN|CSV|CSV_TS|SIMPLE|SUMMARY]

    JVM、GC详解及调优_jvm_JVM、GC详解及调优_

    2. **GC日志分析**:通过分析GC日志,了解GC行为,找出性能瓶颈。 3. **并行与并发设置**:调整并行GC线程数和并发GC策略,优化性能。 4. **对象存活率预估**:通过调整Survivor区比例,减少Full GC的发生。 5. **...

    深入理解JVM & G1 GC

    5. 监控与日志:开启`-XX:+PrintGCDetails`和`-XX:+PrintAdaptiveSizePolicy`,了解GC行为并进行调整。 在实际应用中,了解和掌握JVM的内存管理和G1 GC的工作机制,结合具体的应用场景进行适当的调优,可以显著提升...

    Sun Hotspot V1.6.0 JVM GC PPT.pdf

    使用`-verbose:gc`、`-XX:+PrintGCDetails`以及`-Xloggc:gc.log`等选项可以输出详细的GC日志信息。 例如,串行GC的日志输出如下: ``` [GC [DefNew: 11509K->1138K(14336K), 0.0110060 secs] 11509K->1138K(38912K...

    gchisto.zip

    1. **日志解析**:能够读取和解析标准的JVM GC日志格式,提取出关键指标。 2. **统计分析**:计算GC的频率、平均耗时、最大耗时等,为性能调优提供依据。 3. **图表展示**:将GC事件以时间线的形式展现,便于观察GC...

Global site tag (gtag.js) - Google Analytics