Можете ли вы получить базовую статистику GC на Java?
Я хотел бы, чтобы некоторые долгосрочные серверные приложения периодически выводили общие значения производительности GC на Java, что-то вроде GC-эквивалента Runtime.freeMemory() и т.д. Что-то вроде количества выполненных циклов, среднего времени и т.д.
У нас есть системы, работающие на машинах клиентов, где есть подозрение, что неверно сконфигурированные пулы памяти вызывают чрезмерную частоту и длину GC - мне кажется, что в целом было бы полезно периодически сообщать о основной деятельности GC.
Есть ли какой-либо независимый от платформы способ сделать это?
EDIT: я специально хочу выводить эти данные в системный журнал (консоль) во время работы; это не то, что я хочу подключить к JVM для, как это было бы с JConsole или JVisualVM.
Edit2: MX bean выглядит так, как я хочу - есть ли у кого-нибудь пример рабочего кода, который получает один из них?
Ответы
Ответ 1
Здесь приведен пример использования GarbageCollectorMXBean
для распечатки GC-статистики. Предположительно, вы бы вызывали этот метод периодически, например. планирование с использованием ScheduledExecutorService
.
public void printGCStats() {
long totalGarbageCollections = 0;
long garbageCollectionTime = 0;
for(GarbageCollectorMXBean gc :
ManagementFactory.getGarbageCollectorMXBeans()) {
long count = gc.getCollectionCount();
if(count >= 0) {
totalGarbageCollections += count;
}
long time = gc.getCollectionTime();
if(time >= 0) {
garbageCollectionTime += time;
}
}
System.out.println("Total Garbage Collections: "
+ totalGarbageCollections);
System.out.println("Total Garbage Collection Time (ms): "
+ garbageCollectionTime);
}
Ответ 2
См. GarbageCollectorMXBean.
Ответ 3
Попробуйте -XX:-PrintGC
и -XX:-PrintGCDetails
; см. Параметры отладки VM.
Ответ 4
Отключить тему, но вы можете подключить VisualVM и JConsole к запущенным приложениям и посмотреть полезные статистические данные.