GC日志参数详解

本文详细介绍Java垃圾回收(GC)日志的解析方法,包括GC简要信息、详细信息及堆详情输出等内容,帮助读者深入理解GC机制,并提供OOM dump文件转储等实用配置。

1 输出GC简要信息

-verbose:gc 或-XX:+PrintGC

[GC (Allocation Failure)  7987K->5378K(19456K), 0.0133927 secs]

[GC (Allocation Failure)  13570K->11246K(19456K), 0.0220739 secs]

[Full GC (Ergonomics)  11246K->11188K(19456K), 0.2417921 secs]

[Full GC (Ergonomics)  18717K->16418K(19456K), 0.2618319 secs]

[Full GC (Allocation Failure)  16418K->16398K(19456K), 0.1658426 secs]

 

7987K->5378K(19456K), 0.0133927 secs含义:GC前已使用容量->GC后已使用容量(总容量),GC耗时,单位s

GC (Allocation Failure) :说明GC类型,括号中说明发生GC的原因。如这里说明发生了minor gc,原因是内存分配失败。

2 输出GC详细信息

-XX:+PrintGCDetails

[GC (Allocation Failure) [PSYoungGen: 7970K->1017K(9216K)] 7970K->5382K(19456K), 0.0165871 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] 

[GC (Allocation Failure) --[PSYoungGen: 9209K->9209K(9216K)] 13574K->19444K(19456K), 0.0325471 secs] [Times: user=0.08 sys=0.00, real=0.03 secs] 

[Full GC (Ergonomics) [PSYoungGen: 9209K->0K(9216K)] [ParOldGen: 10234K->10180K(10240K)] 19444K->10180K(19456K), [Metaspace: 3150K->3150K(1056768K)], 0.2389364 secs] [Times: user=0.36 sys=0.00, real=0.24 secs] 

 [PSYoungGen: 7970K->1017K(9216K)] 含义:新生代:GC前已使用容量->GC后已使用容量(新生代总容量)

7970K->5382K(19456K)含义:整个java堆:GC前已使用容量->GC后已使用总容量(java堆总容量)

 0.0165871 secs 含义:GC耗时,单位s

Heap

 PSYoungGen      total 9216K, used 8192K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)

  eden space 8192K, 100% used [0x00000000ff600000,0x00000000ffe00000,0x00000000ffe00000)

  from space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

  to   space 1024K, 48% used [0x00000000fff00000,0x00000000fff7be10,0x0000000100000000)

 ParOldGen       total 10240K, used 7990K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)

  object space 10240K, 78% used [0x00000000fec00000,0x00000000ff3cd898,0x00000000ff600000)

 Metaspace       used 3182K, capacity 4600K, committed 4864K, reserved 1056768K

  class space    used 357K, capacity 424K, committed 512K, reserved 1048576K

PSYoungGen      total 9216K, used 8192K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)含义:

新生代总大小9216K,已使用8192K,内存申请起始地址,已申请到的终点位置,最多能申请到的位置

3 GC前后堆的详细信息

-XX:+PrintHeapAtGC

{Heap before GC invocations=1 (full 0):

 PSYoungGen      total 9216K, used 7969K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)

  eden space 8192K, 97% used [0x00000000ff600000,0x00000000ffdc86a8,0x00000000ffe00000)

  from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)

  to   space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

 ParOldGen       total 10240K, used 0K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)

  object space 10240K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ff600000)

 Metaspace       used 3150K, capacity 4600K, committed 4864K, reserved 1056768K

  class space    used 353K, capacity 424K, committed 512K, reserved 1048576K

[GC (Allocation Failure) [PSYoungGen: 7969K->1001K(9216K)] 7969K->5366K(19456K), 0.0150862 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] 

Heap after GC invocations=1 (full 0):

 PSYoungGen      total 9216K, used 1001K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)

  eden space 8192K, 0% used [0x00000000ff600000,0x00000000ff600000,0x00000000ffe00000)

  from space 1024K, 97% used [0x00000000ffe00000,0x00000000ffefa798,0x00000000fff00000)

  to   space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)

 ParOldGen       total 10240K, used 4364K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)

  object space 10240K, 42% used [0x00000000fec00000,0x00000000ff0432e0,0x00000000ff600000)

 Metaspace       used 3150K, capacity 4600K, committed 4864K, reserved 1056768K

  class space    used 353K, capacity 424K, committed 512K, reserved 1048576K

}

invocations=1:发生GC的总次数(Major GC, Full GC)

full 0:发生Full GC的总次数

4 OOM dump文件转储

-XX:+HeapDumpOnOutOfMemoryError :发生OutOfMemoryError时,转储堆快照

-XX:HeapDumpPath=E:\java\dump :指定dump文件路径,不指定则默认放到项目路径下

可使用Memory Analyzer分析dump文件,

Eclipse安装地址:http://download.eclipse.org/mat/1.6.1/update-site/

下载地址:http://www.eclipse.org/mat/downloads.php

5 其他GC参数

-XX:+PrintGCTimeStamps:GC发生的时间,自JVM启动以后以秒计量

-XX:+PrintGCApplicationStoppedTime:输出GC造成应用暂停的时间,如:

Total time for which application threads were stopped: 0.3797230 seconds, Stopping threads took: 0.0000215 seconds

-XX:+PrintGCDateStamps:GC发生的时间,格式如:

2017-03-21T20:50:40.130+0800

-Xloggc:/logs/gc.log  输出GC日志到文件

欢迎指出本文有误的地方,转载请注明原文出处https://my.oschina.net/7001/blog/870988

转载于:https://my.oschina.net/7001/blog/870988

<think>嗯,用户想了解JVMGC日志参数配置,这涉及JVM调优的关键部分。结合三篇引用内容,特别是新版JVM的变化,可以整理出清晰的配置方案。引用1提到G1GC配置示例和日志输出路径,引用2详细对比了Java9前后日志参数的差异,引用3补充了元数据区等重要参数。这说明需要区分Java版本讲解,用户可能正在迁移旧项目或优化生产环境配置。注意到用户明确要求"详解",准备从日志框架演变讲起。考虑划分模块说明:基础参数(输出开关/路径)、格式控制(时间戳/级别)、高级选项(堆/元空间)和版本适配策略。对于Java9+要重点解释-Xlog指令的灵活性,比如使用装饰器添加附加信息的方式可能正是用户需要的。示例部分将展示两种典型场景:开发环境调试用详细GC日志(带时间戳和堆信息),生产环境轻量日志(仅记录关键事件)。考虑引用2里的可视化工具GcViewer也应该包含在后续问题中,用户分析日志时可能需要。用户应该是后端开发或运维,三篇引用都偏向实战,推测更关注具体参数效果而非理论。准备避免过多GC算法原理解释,直接关联参数设置与实际输出效果的关系。比如-XX:+PrintAdaptiveSizePolicy对于排查G1动态调整特别有用。考虑到存在版本兼容问题,结尾决定添加版本适配说明。这样用户无论使用Java8还是11+都能直接套用模板。后续问题设置了参数优化和异常排查方向,这和调优的实际工作流程一致:先配日志再看数据最后解决问题。</think> 以下是基于Java不同版本的JVM GC日志参数详解,结合核心配置项和实际示例说明: --- ### **一、GC日志核心参数配置** #### **1. 日志输出基础控制** | 参数 | 作用 | 适用版本 | |------|------|----------| | `-Xlog:gc*` | 开启所有GC事件日志记录 | Java 9+ | | `-XX:+PrintGC` | 输出简要GC信息 | Java 8- | | `-XX:+PrintGCDetails` | 输出详细GC堆内存变化 | Java 8- | | `-Xlog:gc:gc.log` | 将日志输出到gc.log文件 | Java 9+ | | `-XX:+PrintGCDateStamps` | 添加时间戳(需配合`PrintGC`) | Java 8- | #### **2. 日志格式增强** | 参数 | 作用 | |------|------| | `-Xlog:gc*,time:gc_time.log` | 添加精确时间戳(Java 9+)<sup>[^2]</sup> | | `-Xlog:gc*:file=gc.log:tags,uptime` | 日志添加线程/时间信息(Java 9+) | | `-XX:+PrintTenuringDistribution` | 打印对象年龄分布(用于分析晋升行为) | #### **3. 堆与GC算法参数** ```bash -XX:+UseG1GC # 启用G1收集器 -XX:MaxGCPauseMillis=100 # 目标最大停顿时间(ms) -Xms512m -Xmx512m # 堆初始/最大内存 -XX:MetaspaceSize=128m # 元空间初始大小(Java 8+取代永久代) -XX:MaxMetaspaceSize=256m # 元空间上限<sup>[^3]</sup> ``` --- ### **二、不同版本配置示例** #### **▶ Java 8及之前** ```bash -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -XX:MaxMetaspaceSize=256m ``` #### **▶ Java 9及之后(推荐)** ```bash -Xlog:gc*,gc+heap*,gc+age*:file=gc.log:time,level,tags -XX:+UseG1GC -XX:MaxGCPauseMillis=150 -Xms512m -Xmx512m ``` --- ### **三、日志关键内容解析** **示例日志片段(G1 GC)**: ```log [2023-10-01T12:00:00.123+0800][info][gc,heap] GC(42) Eden regions: 50->0(50) [info][gc,heap] GC(42) Survivor regions: 5->5(10) [info][gc,heap] GC(42) Old regions: 30->35 [info][gc,heap] GC(42) Humongous regions: 1->1 [info][gc ] GC(42) Pause Young (Normal) 25ms ``` - **Eden/Survivor**:年轻代区域变化 - **Old regions**:老年代占用增长 - **Pause Young**:年轻代GC停顿时间 --- ### **四、可视化分析工具** 1. **GcViewer**:开源工具,解析GC日志生成图表 ![GC暂停时间直方图示例](https://gcviewer.org/img/screen1.jpg) (可分析暂停时间分布、内存趋势等) 2. **通用日志分析方法**: - 高频Full GC → 检查老年代/元空间设置 - 长暂停时间 → 调整`MaxGCPauseMillis`或堆大小 - Survivor区频繁清零 → 对象过早晋升 --- ### **五、版本适配注意** - **Java 9+** 使用`-Xlog`统一日志框架,废弃`PrintGCDetails`等旧参数<sup>[^2]</sup> - **Java 17+** 默认G1收集器,建议显式配置`-XX:+UseG1GC`保持兼容性 --- ### **相关问题扩展** 1. 如何分析GC日志中的 **"Allocation Failure"** 报错? 2. G1与ZGC日志参数配置有何差异? 3. 生产环境如何平衡 **详细日志记录** 与 **磁盘IO开销**? 4. 怎样通过GC日志判断 **内存泄漏**? > 参考资料: > [^1]: Java高阶私房菜:GC日志实战配置 > [^2]: jvm-47: GC日志获取与GcViewer分析 > [^3]: JVM元空间参数详解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值