说结论,有两种方法
一、JVM启动时
Jvm 启动时,添加参数:
-Xlog:gc*:file={file-path}
二、Jstat加进程号
优势,可在JVM运行时,无需任何先决条件的情况下动态捕获GC 指标,说白了就是 jvm 启动后,再去获取。
典型命令:
jstat -gc -t 11656 10000 30
- -gc :将显示与垃圾收集相关的统计信息
- -t :自JVM启动以来的时间戳将被打印(以秒为单位)
- 11656:目标JVM进程ID
- 10000:每10,000毫秒(即10秒)将打印一次统计信息。
- 30 :将打印30次迭代的统计信息。 因此,以上选项将导致JVM打印指标300秒(即10秒x 30次迭代)。
除了-gc之外,还可以传递其他选项来生成不同的数据集。有关不同选项的更多详细信息,如下:
- S0C –幸存者0区域的容量,以KB为单位
- S1C –幸存者1区域的容量,以KB为单位
- S0U –幸存者0区域使用的空间以KB为单位
- S1U –幸存者1区域以KB为单位使用空间
- EC –伊甸园地区容量(KB)
- 欧盟–伊甸园地区的已利用空间(以KB为单位)
- OC –旧区域容量(KB)
- OU –旧区域的已利用空间,以KB为单位
- MC –元空间区域容量,以KB为单位
- MU –元空间区域使用的空间以KB为单位
- CCSC –压缩类空间区域的容量,以KB为单位
- CCSU –压缩类空间区域以KB为单位使用空间
- YGC –迄今为止发生的年轻GC事件的数量
- YGCT –到目前为止,年轻GC花费的时间
- FGC –迄今为止已发生的完全GC事件的数量
- FGCT –到目前为止已花费的完整GC时间
- GCT –到目前为止所花费的GC时间总量(基本上是YGCT + FGCT)
Jstat 的输出解释
时间戳记 | 自JVM启动以来的时间(以秒为单位) | = 164.9秒 |
---|---|---|
年轻一代的能力 | 年轻一代由幸存者0,幸存者1,伊甸园地区组成。因此,容量为:S0C + S1C + EC | = 116224.0 + 116224.0 + 116736.0= 349184 kb= 341 mb |
年轻一代利用尺寸 | S0U + S1U +欧盟 | = 0 + 1520 + 68761.8= 70281.8 kb= 68.63 mb |
老一代容量 | 超频 | = 431616 kb= 421.5 mb |
上一代利用尺寸 | OU | = 280502.5 kb= 273.93 mb |
元空间容量 | MC | = 32384 kb= 31.62 mb |
元空间利用的大小 | 亩 | = 31155.5 kb= 30.42mb |
年轻GC计数 | 青年会 | = 29 |
在Young GC中花费的时间 | 青年会 | = 0.836秒 |
在GC中花费的总时间 | GCT | = 2.27秒 |
Jstat的挑战
Jsta t的挑战之一是需要手动分析生成的统计信息。 而仅了解/解释一行内容将花费很长时间,这将很繁琐。 因此,可以使用 GCeasy 工具,该工具可以解析 jstat 输出并生成有洞察力的图形和指标。 这是 GCeasy 通过分析上述jstat输出生成的 Jstat分析报告 。
Jstat的局限性
Jstat 没有提供 GC 活动的详细信息。 它仅提供必要的信息。 因此,我们将无法获得以下信息:
- 如果一次采样中报告了多个GC事件 ,我们将不知道每个GC事件的暂停时间是多少。
- 用户(即Java层),系统(即内核)和用户花费了多少时间
- 有多少个GC线程正在工作,并占用了多少时间?
- 一个GC事件具有几个子阶段(例如初始标记,清理,备注,并发标记……)。 信息分类不可用。
- 每个GC事件回收了多少字节
有时,jstat 报告的数据也会产生 误导 。
最后
如果您想进行准确的GC分析,GC日志是更可靠的方法。