使 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 以 MBGB 为单位打印这些数字?

我在 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 日志记录。阅读 GarbageCollectorMXBeanGarbageCollectionNotificationInfoGcInfo。 https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GcInfo.html

【讨论】:

以上是关于使 Java GC 日志显示 MB 或 GB 而不是 KB的主要内容,如果未能解决你的问题,请参考以下文章

java gc的日志在哪里看?

Java 内存不足。这不是内存泄漏吗?

Java非常大的堆大小[关闭]

GC之七--gc日志分析工具

浅析JVM中的GC日志

PowerShell KB MB GB TB PB在powershell的显示