Как найти время, прошедшее с момента последней сборки мусора с помощью JVM? - PullRequest
2 голосов
/ 09 апреля 2019

В основном это касается Oracle Java 8 JVM. Предположим, у меня нет доступа к журналам. Java не работает в подробном режиме, и stdin / stderr не регистрируются.

Есть ли место в работающей JVM, где хранится метка времени последнего события GC? Или что-нибудь еще, что может указывать, когда произошло последнее событие GC?

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

1 Ответ

1 голос
/ 09 апреля 2019

Если вам подходит решение, которое работает с Oracle 8 Java JVM, и может работать с другими, вы можете использовать расширение GarbageCollectorMXBean платформы . Я связался с документацией JDK 11, так как этот класс не включен в документацию JDK 8, но этот тип присутствует, и работает следующее решение.

final RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
long base = rt.getStartTime();

for(GarbageCollectorMXBean gc: ManagementFactory.getGarbageCollectorMXBeans()) {
  if(gc instanceof com.sun.management.GarbageCollectorMXBean) {
    com.sun.management.GcInfo info =
        ((com.sun.management.GarbageCollectorMXBean)gc).getLastGcInfo();

    if(info != null) {
      System.out.printf("%-15s%tF %2$tT.%2$tL  (%6dms ago)%n",
        gc.getName(), base + info.getStartTime(), rt.getUptime()-info.getStartTime());
    }
  }
}

Когда я добавил,

System.gc();
System.out.println(System.getProperty("java.version"));

для простого запуска я получил

1.8.0_131
PS Scavenge    2019-04-09 11:58:25.808  (    50ms ago)
PS MarkSweep   2019-04-09 11:58:25.809  (    74ms ago)

Эту информацию также можно запрашивать удаленно, см. Также Способы доступа к MXBeans . Он работает, если в JVM агент управления уже запущен или доступен через API присоединения (обычно подразумевается запуск на том же компьютере), поэтому агент управления можно запустить позже. Эти параметры также используются такими инструментами, как VisualVM.

...