使 Java GC 日志显示 MB 或 GB 而不是 KB
Posted
技术标签:
【中文标题】使 Java GC 日志显示 MB 或 GB 而不是 KB【英文标题】:Make Java GC logs show MB or GB instead of KB 【发布时间】:2016-09-21 03:15:59 【问题描述】:默认情况下,Java GC 日志 输出以 KB(千字节)显示内存详细信息。我知道这听起来可能很傻,但鉴于我处理的大多数 Jvm 的堆大小接近 20 到 40GB,我发现快速读取 KB 中的数字非常不方便,尤其是在快速扫描 putty 等日志时。
是否可以让 Java 以 MB 或 GB 为单位打印这些数字?
我在 JDK 文档中没有找到任何选项。
如果不可能,是否有关于如何将此功能添加到 GC 日志记录的任何想法? (不是来自外部,而是来自 JVM)
提前感谢您的帮助。
【问题讨论】:
【参考方案1】:没有运行时选项可以改变这一点,这取决于特定的垃圾收集器使用什么来打印日志数据。
在 JDK 8 中使用 G1,它会根据堆大小以适当的单位打印:
$ java -XX:+UseG1GC -verbose:gc
[GC pause (Metadata GC Threshold) (young) (initial-mark) 592M->23M(100G), 0.0137879 secs]
升级到 JDK 9,然后统一日志将以适当的单位打印,具体取决于堆大小,用于所有收集器(另外,时间戳也采用适当的单位):
$ java -XX:+UseParallelGC -Xlog:gc
[0.766s][info][gc] GC(0) Pause Young (Metadata GC Threshold) 4300M->15M(117760M) 6.765ms
【讨论】:
【参考方案2】:假设您的 GC 日志文件位于:(./my-app-gc.log,
)
然后使用这个在线插件来调用 API:
curl -X POST --data-binary @./my-app-gc.log http://api.gceasy.io/analyzeGC?apiKey= --header "Content-Type:text"
或者使用第三个软件[PostMan
]
本软件支持: ..................................................... .... | • - 电脑下载:here | | • - 浏览器下载:here | ..................................................... .... PostMan 插件输出示例:
"isProblem": true,
"problem": [
"122 times threads were stopped for more than 5 seconds"
],
"jvmHeapSize":
"youngGen":
"allocatedSize": "7.5 gb",
"peakSize": "6 gb"
,
"oldGen":
"allocatedSize": "22.5 gb",
"peakSize": "22.5 gb"
,
"metaSpace":
"allocatedSize": "1.04 gb",
"peakSize": "48.52 mb"
,
"total":
"allocatedSize": "30 gb",
"peakSize": "28.5 gb"
,
"gcStatistics":
"totalCreatedBytes": "249.49 gb",
这个输出为你提供了一个有用的 Json 格式的数据,以后可以使用。
【讨论】:
或者您可以直接使用计算机上的 GCViewer 应用程序,而不是将您的数据提交给第三方服务。【参考方案3】:也许您可以创建简单的 bash 程序来重新格式化您的日志?
在我的示例中,我假设您使用的是 linux 并且路径上有 groovy。
在/usr/bin
中创建文件kb2mb
,内容如下:
#!/usr/bin/env groovy
System.in.readLines().each
println(it.replaceAll(/\d+K/)
(((it[0..-2] as Integer) / 1024) as Double).round(2) + "M"
)
然后授予程序执行权限:chmod +x /usr/bin/kb2mb
。
终于可以这样运行了:
cat gc.log|kb2mb
示例输出:
2015-05-26T14:45:37.987-0200: 151.126: [GC(分配失败)151.126: [DefNew: 614.37M->68.25M(614.38M), 0.0584157 秒] 1581.39M-> 12753.41M(197. M), 0.0585007 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]
您当然可以使用 bash、python 等来代替 groovy。
【讨论】:
【参考方案4】:我不熟悉这一点,但我知道您可以尝试从您的应用程序中进行 gc 日志记录。阅读 GarbageCollectorMXBean、GarbageCollectionNotificationInfo 和 GcInfo。 https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GcInfo.html
【讨论】:
以上是关于使 Java GC 日志显示 MB 或 GB 而不是 KB的主要内容,如果未能解决你的问题,请参考以下文章