GC日志

Java应用程序的GC日志对分析定位很多性能问题有着非常大的帮助。默认情况下,Java应用程序不会自动产生GC日志。如果需要输出GC日志,必须在JVM启动时增加对应的参数。

-XX:+PrintGC 输出GC日志

-XX:+PrintGCDetails 输出GC的详细日志

-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)

-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

-Xloggc:../logs/gc.log 日志文件的输出路径

kubernetes 容器环境JVM内存配置最佳实践,参考 kubernetes

img

JVM信息

这些日志提供了关于你的Java虚拟机 (JVM) 和运行时环境的一些重要信息。让我解释一下:

根据这些信息,正在使用OpenJDK 64位服务器虚拟机,在Linux上运行版本为1.8.0_332的JRE。你的JVM配置中包含了一些与内存管理和垃圾收集器相关的参数。

串行Serial GC

参数: -XX:+UseSerialGC

并行Parallel GC

参数: -XX:+UseParallelGC

DefNew:是使用-XX:+UseSerialGC(新生代,老年代都使用串行回收收集器)。

ParNew:是使用-XX:+UseParNewGC(新生代使用并行收集器,老年代使用串行回收收集器)或者-XX:+UseConcMarkSweepGC(新生代使用并行收集器,老年代使用CMS)。

PSYoungGen:是使用-XX:+UseParallelOldGC(新生代,老年代都使用并行回收收集器)或者-XX:+UseParallelGC(新生代使用并行回收收集器,老年代使用串行收集器)

garbage-first heap:是使用-XX:+UseG1GC(G1收集器)

参考: ParNew 和 PSYoungGen 和 DefNew 是一个东西么

日志解析

第一次 GC (Allocation Failure)

第二次 Full GC (Metadata GC Threshold)

CMS GC日志

CMS(Concurrent Mark Sweep,并发-标记-清除)是目前最常用的 JVM 垃圾回收器,这里不解释 CMS 的工作过程,只记录一些基础要点以帮助理解后面的内容:

GC 的设计目标是避免在老年代垃圾收集时出现长时间的卡顿

参数: -XX:+UseParNewGC, -XX:+UseConcMarkSweepGC

这些日志条目看起来是Java虚拟机 (JVM) 的垃圾收集器 (Garbage Collector) 的输出。让我解释一下:

  1. GC (Allocation Failure): 垃圾收集器在处理内存分配失败时进行了垃圾回收。

    1. ParNew: 这是新生代垃圾收集器的名称,它负责收集新分配的对象。在这里,新生代从 3774912K 减少到 419392K,总内存大小为 3774912K,并且此操作耗时 0.4937775 秒。
    2. 26066892K->23189504K(32086464K): 整个堆内存从 26,066,892K 减少到 23,189,504K,总内存大小为 32,086,464K。
  2. GC (CMS Initial Mark): CMS是"Concurrent Mark-Sweep"的缩写,是一种并发标记清除垃圾收集器。在这里,CMS执行了初始标记阶段,耗时 0.0738273 秒。当前步骤需要JVM暂停STW,标记的根对象GC root。

  3. CMS-concurrent-mark-start: CMS开始并发标记阶段。

  4. CMS-concurrent-mark: 并发标记阶段耗时 3.11 秒,其中用户时间为 12.87 秒。

  5. CMS-concurrent-preclean-start: CMS开始并发预清理阶段。

  6. CMS-concurrent-preclean: 并发预清理阶段耗时 0.13 秒。

  7. CMS-concurrent-abortable-preclean-start: CMS开始可中止的并发预清理阶段。

  8. CMS: abort preclean due to time: 由于时间原因,CMS中止了预清理阶段。

  9. GC (CMS Final Remark): CMS执行最终的备注阶段。这个阶段包括重新扫描、弱引用处理、类卸载、符号表清理和字符串表清理。

  10. CMS-concurrent-sweep-start: CMS开始并发清理阶段。

  11. CMS-concurrent-sweep: 并发清理阶段耗时 8.99 秒。

  12. CMS-concurrent-reset-start: CMS开始并发重置阶段。

  13. CMS-concurrent-reset: 并发重置阶段耗时 0.04 秒。

这些日志提供了垃圾收集器在执行过程中的详细信息,包括各个阶段的耗时以及内存的变化情况。

G1 GC日志

添加参数: -XX:+UseG1GC

通过划分多个内存区域做增量整理和回收,进一步降低延迟 G1 的全称是Garbage-First,意为垃圾优先,哪一块的垃圾最多就优先清理它 G1 GC 最主要的设计目标是:将STW 停顿的时间和分布,变成可预期且可配置的 堆不再分成年轻代和老年代,而是划分为多个(通常是2048 个)可以存放对象的小块堆区域(smaller heap regions)。每个小块,可能一会被定义成Eden 区,一会被指定为Survivor区或者Old 区。在逻辑上,所有的Eden 区和Survivor区合起来就是年轻代,所有的Old 区拼在一起那就是老年 Java8默认并行Parallel GC,Java9, Java11 默认G1GC

这些日志看起来是来自Java虚拟机 (JVM) 的垃圾收集器的输出。让我来解释一下各个部分的含义:

这些日志提供了有关垃圾收集过程中不同阶段的信息,包括暂停事件、并发阶段和各阶段的持续时间。通过这些日志,你可以了解JVM在运行时是如何进行垃圾收集的。如果你需要更多关于这些日志的解释或者有其他相关问题,欢迎随时提问。