Сделать журналы GC GC show MB или GB вместо KB
По умолчанию Java GC log выводится информация о памяти в КБ (килобайтах). Я знаю, что это может показаться глупым, но, учитывая, что большинство Jvms, с которыми я имею дело, имеют размеры кучи, близкие к 20-40 ГБ, мне очень неудобно быстро считывать числа в КБ, особенно при быстром сканировании журналов в шпакле и т.д.
Можно ли заставить Java напечатать эти числа в долях MB или GB вместо этого?
В документации JDK я не нашел никакого варианта.
Если это невозможно, есть ли идеи о том, как можно добавить эту функцию для регистрации GC? (не извне, а из с JVM)
Заранее благодарим вас за помощь.
Ответы
Ответ 1
Для изменения этого параметра нет времени выполнения, это зависит от того, какой конкретный сборщик мусора использует для печати данных ведения журнала.
Используйте G1 в JDK 8, и он будет печатать в соответствующих единицах, в зависимости от размера кучи:
$ java -XX:+UseG1GC -verbose:gc
[GC pause (Metadata GC Threshold) (young) (initial-mark) 592M->23M(100G), 0.0137879 secs]
Перейдите на JDK 9, а затем Unified Logging будет печатать в соответствующих единицах, в зависимости от размера кучи, для всех сборщиков (плюс, отметки времени также находятся в соответствующих единицах):
$ 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
]
Это программное обеспечение Поддержка:
......................................................
| • - Загрузить для компьютера: здесь
| • - Загрузить для браузеров : здесь
......................................................
Пример вывода плагина 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 Format of Data.
Ответ 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,37 М- > 68,25 М (614,38 М), 0,0584157 сек] 1581,39 М- > 1243,41 М (1979,75 M), 0,0585007 сек.] [Times: user = 0,06 sys = 0,00, real = 0,06 secs]
Вместо groovy вы можете, конечно, использовать bash, python и т.д.
Ответ 4
Я не знаком с этим моментом, но знаю, что вы можете попытаться сделать gc-протоколирование из своего приложения. Читайте о GarbageCollectorMXBean, GarbageCollectionNotificationInfo и GcInfo.
https://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/GcInfo.html