默认情况下,Java GC日志以KB(千字节)为单位显示内存详细信息。我知道这听起来很傻,但鉴于我处理的大多数JVM的堆大小接近20到40GB,我发现在快速扫描putty等日志时迅速阅读KB数字相当不方便。
是否可能使Java以MB或GB的分数打印这些数字?
我没有在JDK文档中找到任何选项。
如果不可能,是否有任何想法可以实现将此功能添加到GC日志记录中? (不是从外部而是从JVM内部)
提前感谢您的帮助。
默认情况下,Java GC日志以KB(千字节)为单位显示内存详细信息。我知道这听起来很傻,但鉴于我处理的大多数JVM的堆大小接近20到40GB,我发现在快速扫描putty等日志时迅速阅读KB数字相当不方便。
是否可能使Java以MB或GB的分数打印这些数字?
我没有在JDK文档中找到任何选项。
如果不可能,是否有任何想法可以实现将此功能添加到GC日志记录中? (不是从外部而是从JVM内部)
提前感谢您的帮助。
没有运行时选项可以更改这个设置,它取决于特定垃圾收集器用于打印日志数据的方式。
在JDK 8中使用G1,它将以适当的单位打印,具体取决于堆大小:
$ java -XX:+UseG1GC -verbose:gc
[GC pause (Metadata GC Threshold) (young) (initial-mark) 592M->23M(100G), 0.0137879 secs]
升级到 JDK 9,然后统一日志记录将根据堆大小以适当的单位打印所有收集器的信息(此外,时间戳也使用适当的单位):
升级至JDK 9,则Unified Logging会根据堆大小为所有收集器打印适当单位的信息(还有,时间戳也使用适当的单位):
(Note: Both translations are correct, but the second one is slightly more concise.)$ java -XX:+UseParallelGC -Xlog:gc
[0.766s][info][gc] GC(0) Pause Young (Metadata GC Threshold) 4300M->15M(117760M) 6.765ms
/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秒] [时间:用户=0.06 sys = 0.00,real = 0.06 secs]
您当然可以使用bash,python等而不是groovy。
假设你的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
]
这个软件支持:
......................................................
| • - 下载电脑版: 这里 |
| • - 下载浏览器版: 这里 |
......................................................
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",
我对这个点不是很熟悉,但我知道你可以尝试从你的应用程序中进行垃圾回收日志记录。请阅读关于GarbageCollectorMXBean、GarbageCollectionNotificationInfo和GcInfo的内容。 https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GcInfo.html