默认情况下, Java GC日志输出以 KB (千字节)显示内存详细信息。我知道这可能听起来很愚蠢,但鉴于我所处理的大多数Jvms都有接近20到40GB的堆大小,我发现快速读取KB中的数字非常不方便,特别是在快速扫描腻子等日志时。
是否可以让Java以 MB 或 GB 的分数打印这些数字?
我在JDK文档中找不到任何选项。
如果无法实现,是否有任何关于如何将此功能添加到GC日志记录的想法? (不是来自外部,而是来自JVM)
提前感谢您的帮助。
答案 0 :(得分:8)
没有运行时选项可以更改它,它取决于用于打印日志记录数据的特定垃圾收集器。
在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
答案 1 :(得分:1)
假设您的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数据格式,可以在以后使用。
答案 2 :(得分:1)
也许您可以创建简单的bash程序来重新格式化日志?
在我的例子中,我假设您正在使用Linux,并且您已经在路上了。
在/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-> 1243.41M(1979.75M),0.0585007 secs] [次:用户= 0.06 sys = 0.00,real = 0.06 secs]
而不是groovy,你当然可以使用bash,python等。
答案 3 :(得分:0)
我不熟悉这一点,但我知道您可以尝试从应用程序进行gc日志记录。阅读 GarbageCollectorMXBean , GarbageCollectionNotificationInfo 和 GcInfo 。 https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GcInfo.html