使Java GC日志显示MB或GB而不是KB

时间:2016-09-21 03:15:59

标签: java logging garbage-collection profiling

默认情况下, Java GC日志输出以 KB (千字节)显示内存详细信息。我知道这可能听起来很愚蠢,但鉴于我所处理的大多数Jvms都有接近20到40GB的堆大小,我发现快速读取KB中的数字非常不方便,特别是在快速扫描腻子等日志时。

是否可以让Java以 MB GB 的分数打印这些数字?

我在JDK文档中找不到任何选项。

如果无法实现,是否有任何关于如何将此功能添加到GC日志记录的想法? (不是来自外部,而是来自JVM)

提前感谢您的帮助。

4 个答案:

答案 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]

本软件支持:
enter image description here .................................................. ....
| • - 下载计算机: 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