Подтвердить что ты не робот

Можете ли вы получить базовую статистику GC на Java?

Я хотел бы, чтобы некоторые долгосрочные серверные приложения периодически выводили общие значения производительности GC на Java, что-то вроде GC-эквивалента Runtime.freeMemory() и т.д. Что-то вроде количества выполненных циклов, среднего времени и т.д.

У нас есть системы, работающие на машинах клиентов, где есть подозрение, что неверно сконфигурированные пулы памяти вызывают чрезмерную частоту и длину GC - мне кажется, что в целом было бы полезно периодически сообщать о основной деятельности GC.

Есть ли какой-либо независимый от платформы способ сделать это?

EDIT: я специально хочу выводить эти данные в системный журнал (консоль) во время работы; это не то, что я хочу подключить к JVM для, как это было бы с JConsole или JVisualVM.

Edit2: MX bean выглядит так, как я хочу - есть ли у кого-нибудь пример рабочего кода, который получает один из них?

4b9b3361

Ответ 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);
}

Ответ 4

Отключить тему, но вы можете подключить VisualVM и JConsole к запущенным приложениям и посмотреть полезные статистические данные.