Java G1 GC: программный поиск количества огромных регионов до/после GC

Я хотел бы программно найти количество огромных регионов до/после запуска GC, чтобы сообщить об этом внешней службе мониторинга.

Я могу найти такую ​​информацию, как действие GC, продолжительность и использование памяти до/после использования ManagementFactory.getGarbageCollectorMXBeans и GarbageCollectionNotificationInfo, но, насколько я могу судить, нет очевидного способа найти количество огромных областей таким же образом.

Есть ли способ программно получить доступ к информации о количестве огромных регионов?


person haroba    schedule 14.11.2019    source источник


Ответы (1)


JDK не экспортирует эти показатели через общедоступный API. Однако получить эту информацию прямо из памяти JVM можно с помощью Unsafe трюков.

HotSpot JVM публикует смещения своих внутренних структур в целях отладки. Эта информация называется VMStructs и доступна в Агент обслуживания HotSpot.

Вот как будет выглядеть инструмент для получения количества огромных регионов.

import sun.jvm.hotspot.gc_implementation.g1.G1CollectedHeap;
import sun.jvm.hotspot.gc_implementation.g1.HeapRegionSetCount;
import sun.jvm.hotspot.runtime.VM;
import sun.jvm.hotspot.tools.Tool;

public class HumongousRegionSet extends Tool {
    @Override
    public void run() {
        G1CollectedHeap heap = (G1CollectedHeap) VM.getVM().getUniverse().heap();
        HeapRegionSetCount count = heap.humongousSet().count();

        System.out.printf("%d humongous regions of total capacity %d MB\n",
                count.length(), count.capacity() >>> 20);
    }

    public static void main(String[] args) {
        new HumongousRegionSet().execute(args);
    }
}

Примечание: этот инструмент получает информацию от внешнего процесса Java.

У меня также есть экспериментальный проект helfy для доступа к VMStructs прямо внутри JVM. Вот пример подсчета огромных областей в запущенном процессе Java: HumongousRegionSet.java

(эта демонстрация в настоящее время работает на Linux и Windows; поддержка macOS пока не поддерживается)

person apangin    schedule 14.11.2019