簡體   English   中英

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

[英]Make Java GC logs show MB or GB instead of KB

默認情況下, Java GC日志輸出以KB (千字節)顯示內存詳細信息。 我知道這可能聽起來很愚蠢,但鑒於我所處理的大多數Jvms都有接近20到40GB的堆大小,我發現快速讀取KB中的數字非常不方便,特別是在快速掃描膩子等日志時。

是否有可能使Java以MBGB的分數打印這些數字?

我在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,然后統一日志記錄將以適當的單位打印,具體取決於堆大小,適用於所有收集器(此外,時間戳也是正確的單位):

$ java -XX:+UseParallelGC -Xlog:gc
[0.766s][info][gc] GC(0) Pause Young (Metadata GC Threshold) 4300M->15M(117760M) 6.765ms

假設您的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"

或使用第3軟件[ 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",

這個輸出為您提供了一個有用的Json格式的數據可以在以后使用。

也許你可以創建簡單的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 secs] 1581.39M-> 1243.41M(1979.75M), 0.0585007秒] [時間:用戶= 0.06 sys = 0.00,實際= 0.06秒]

而不是groovy,你當然可以使用bash,python等。

我不熟悉這一點,但我知道您可以嘗試從您的應用程序進行gc日志記錄。 閱讀GarbageCollectorMXBeanGarbageCollectionNotificationInfoGcInfo https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GcInfo.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM