侧边栏壁纸
  • 累计撰写 43 篇文章
  • 累计创建 9 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

JVM的GC日志参数配置

landonchan
2018-06-12 / 0 评论 / 0 点赞 / 3 阅读 / 8244 字
温馨提示:
欢迎留言讨论!若内容或图片失效,请留言反馈。若不小心影响到您的利益,请联系我们删除。

输出简要GC日志

-XX:+PrintGC ,建议使用 -verbose:gc

[GC (Allocation Failure)  61805K->9849K(256000K), 0.0041139 secs]

  • GC 表示是一次YGC(Young GC)

  • Allocation Failure 表示是失败的类型

  • 68896K->5080K 表示年轻代从68896K降为5080K

  • 256000K表示整个堆的大小

  • 0.0041139 secs表示这次GC总计所用的时间

  • 在JDK 8中,-verbose:gc是-XX:+PrintGC一个别称,日志格式等价与:-XX:+PrintGC,。

  • 不过在JDK 9中 -XX:+PrintGC被标记为deprecated。

  • -verbose:gc是一个标准的选项, -XX:+PrintGC是一个实验的选项,建议使用-verbose:gc替代-XX:+PrintGC

输出详细GC日志

-XX:+PrintGCDetails

[GC (Allocation Failure) [PSYoungGen: 53248K->2176K(59392K)] 58161K->7161K(256000K), 0.0039189 secs] [Times: user=0.02 sys=0.01, real=0.00 secs]

  • GC 表示是一次YGC(Young GC)

  • Allocation Failure 表示是失败的类型

  • PSYoungGen 表示年轻代大小

  • 53248K->2176K 表示年轻代占用从53248K降为2176K

  • 59392K表示年轻代的大小

  • 58161K->7161K 表示整个堆占用从53248K降为2176K

  • 256000K表示整个堆的大小

  • 0.0039189 secs 表示这次GC总计所用的时间

  • [Times: user=0.02 sys=0.01, real=0.00 secs] 分别表示,用户态占用时长,内核用时,真实用时。

  • 时间保留两位小数,四舍五入。

输出GC的时间戳(以JVM启动到当期的总时长的时间戳形式)

-XX:+PrintGCTimeStamps

1.963: [GC (Allocation Failure)  61805K->9849K(256000K), 0.0041139 secs]

仅比-XX:+PrintGC多1.963,表示从JVM启动到打印GC时刻用了1.963秒。

输出GC日志到文件

-Xloggc:filename 输出GC日志到文件(-Xloggc:/path/to/gc-%t.log)

  • 如果使用该参数-Xloggc则默认开启如下两个参数 -XX:+PrintGC -XX:+PrintGCTimeStamps

  • 如果启动参数如下:-Xloggc:gc.log -Xmn64M -Xms256M -Xmx256M则日志格式如下所示

0.318: [GC (Allocation Failure) 49152K->2384K(253952K), 0.0038675 secs]
  • gc.log也可以指定绝对的路径。

  • 在gc.log最前面还会默认打印系统的JDK版本与启动的参数

Java HotSpot(TM) 64-Bit Server VM (25.144-b01) for linux-amd64 JRE (1.8.0_144-b01), built on Jul 21 2017 21:57:33 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)
Memory: 4k page, physical 16287104k(1657700k free), swap 16636924k(15826632k free)
CommandLine flags: -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=268435456 -XX:MaxNewSize=67108864 -XX:NewSize=67108864 -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC

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

-XX:+PrintGCDateStamps

2019-03-05T16:56:15.108+0800: [GC (Allocation Failure)  61805K->9849K(256000K), 0.0041139 secs]

如果加上-XX:+PrintGCDateStamps那么日志仅仅比-XX:+PrintGC最前面多了一个日期时间: 2019-03-05T16:56:15.108+0800, 表示打印GC的时刻的时间是2019-03-05T16:56:15.108+0800。+0800表示是东8区。

在进行GC的前后打印出堆的信息

-XX:+PrintHeapAtGC

  • 使用如下参数-verbose:gc -XX:+PrintHeapAtGC -Xmn64M -Xms256M -Xmx256M

{Heap before GC invocations=1 (full 0):
PSYoungGen      total 57344K, used 49152K [0x00000000fc000000, 0x0000000100000000, 0x0000000100000000)
eden space 49152K, 100% used [0x00000000fc000000,0x00000000ff000000,0x00000000ff000000)
from space 8192K, 0% used [0x00000000ff800000,0x00000000ff800000,0x0000000100000000)
to   space 8192K, 0% used [0x00000000ff000000,0x00000000ff000000,0x00000000ff800000)
ParOldGen       total 196608K, used 0K [0x00000000f0000000, 0x00000000fc000000, 0x00000000fc000000)
object space 196608K, 0% used [0x00000000f0000000,0x00000000f0000000,0x00000000fc000000)
Metaspace       used 7901K, capacity 8264K, committed 8448K, reserved 1056768K
class space    used 888K, capacity 986K, committed 1024K, reserved 1048576K
[GC (Allocation Failure)  49152K->2416K(253952K), 0.0030218 secs]
Heap after GC invocations=1 (full 0):
PSYoungGen      total 57344K, used 2400K [0x00000000fc000000, 0x0000000100000000, 0x0000000100000000)
eden space 49152K, 0% used [0x00000000fc000000,0x00000000fc000000,0x00000000ff000000)
from space 8192K, 29% used [0x00000000ff000000,0x00000000ff258020,0x00000000ff800000)
to   space 8192K, 0% used [0x00000000ff800000,0x00000000ff800000,0x0000000100000000)
ParOldGen       total 196608K, used 16K [0x00000000f0000000, 0x00000000fc000000, 0x00000000fc000000)
object space 196608K, 0% used [0x00000000f0000000,0x00000000f0004000,0x00000000fc000000)
Metaspace       used 7901K, capacity 8264K, committed 8448K, reserved 1056768K
class space    used 888K, capacity 986K, committed 1024K, reserved 1048576K
}
  • 由此可以看出在,打印如下日志前后

[GC (Allocation Failure)  49152K->2416K(253952K), 0.0030218 secs]
  • invocations 表示GC的次数,每次GC增加一次,每次GC前后的invocations相等

  • Heap before GC invocations=1 表示是第1次GC调用之前的堆内存状况

  • {Heap before GC invocations=1 (full 0): 表示是第1次GC调用之后的堆内存状况

GC处理Reference耗时的相关参数

  • 此设置 -XX:+PrintReferenceGC可以打印出SoftReference,WeakReference,FinalReference,PhantomReference,JNI Weak Reference几种引用的数量,以及清理所用的时长,该参数在进行YGC调优时可以排上用场。

[GC (Allocation Failure) [SoftReference, 0 refs, 0.0000119 secs][WeakReference, 499 refs, 0.0000370 secs][FinalReference, 1045 refs, 0.0002313 secs][PhantomReference, 0 refs, 0 refs, 0.0000039 secs][JNI Weak Reference, 0.0000290 secs][PSYoungGen: 53456K->4880K(57344K)] 53496K->4928K(253952K), 0.0037199 secs] [Times: user=0.02 sys=0.01, real=0.01 secs]

打印GC STW时长

-XX:+PrintGCApplicationStoppedTime

打印safepoint信息

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

打印对象分布,年龄分布

-XX:+PrintTenuringDistribution

开启日志文件分割

-XX:+UseGCLogFileRotation  

最多分割几个文件,超过之后从头开始写

-XX:NumberOfGCLogFiles=12

每个文件上限大小,超过就触发分割

-XX:GCLogFileSize=100M

常见的配置

# 必备
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-XX:+PrintTenuringDistribution 
-XX:+PrintHeapAtGC 
-XX:+PrintReferenceGC 
-XX:+PrintGCApplicationStoppedTime

# 可选
-XX:+PrintSafepointStatistics 
-XX:PrintSafepointStatisticsCount=1

# GC日志输出的文件路径
-Xloggc:/path/to/gc-%t.log
# 开启日志文件分割
-XX:+UseGCLogFileRotation 
# 最多分割几个文件,超过之后从头文件开始写
-XX:NumberOfGCLogFiles=14
# 每个文件上限大小,超过就触发分割
-XX:GCLogFileSize=100M

0

评论区