Java 8 узнает размер metaspace во время выполнения

Java 8 использует метапространство, которое способно динамически расширяться. GC будет работать в метапространстве, когда оно заполнится. Означает ли это, что GC никогда не будет работать в метапространстве?

Мое приложение Java 8 использует много памяти. Я хотел бы знать, каков размер моего метапространства во время выполнения. Как я могу это сделать?

Я думаю о настройке MaxMetaspaceSize. Что я должен установить это? Любые рекомендации?

Ответ 1

Вариант 1:

Выполнить

jstat -gc PID

(с заменой PID на PID JVM для мониторинга), который вернет sth. как:

S0C      S1C       S0U   S1U     EC       EU        OC         OU        MC       MU       CCSC    CCSU       YGC   YGCT     FGC    FGCT    GCT
103936.0 107008.0  0.0   41618.3 820736.0 401794.3  444928.0   183545.7  181888.0 137262.8 28544.0 20386.6    313   16.024   8      3.706   19.729

В соответствии с этот представляет интерес:

MC: Metaspace capacity (kB)
MU: Metaspace utilization (kB)

Таким образом, в этом случае около 181mb Metaspace фиксируются, а в настоящее время используется 137mb.

Вариант 2:

Если у вас есть журналы сбора мусора, вы также можете найти это оттуда, например. после того, как приложение потерпело крах или сообщила о проблеме. Найдите строки типа

2016-04-06T01:50:04.842+0200: 7.795: [Full GC (Metadata GC Threshold)
[PSYoungGen: 7139K->0K(177152K)]
[ParOldGen: 18396K->22213K(101888K)] 25535K->22213K(279040K), 
[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs]
[Times: user=0.45 sys=0.00, real=0.14 secs]

Это представляет собой изменение размера метапроцесса при достижении предыдущего порога.

[Metaspace: 34904K->34904K(1081344K)], 0.1408610 secs]

содержит соответствующую информацию: 34,9mb использовались до, а также после GC. Последняя из этих записей журнала, которую вы можете найти, покажет текущий размер (то есть: после GC).

Имейте в виду, что полный GC запускается всякий раз, когда Metaspace изменяется. Поэтому неплохо настроить хорошее начальное значение для этого, когда вы уже знаете, что значение по умолчанию ~ 21mb (в зависимости от конфигурации хоста) недостаточно.

Подробнее о настройке размера метаданных см. .

Ответ 2

for (MemoryPoolMXBean memoryMXBean : ManagementFactory.getMemoryPoolMXBeans()) {
    if ("Metaspace".equals(memoryMXBean.getName())) {
            System.out.println(memoryMXBean.getUsage().getUsed()/1024/1024 + " mb");
    }
}

Да, лучше установить MaxMetaspaceSize если вы думаете, что это утечка для мониторинга и исправления.

Ответ 3

Используйте jcmd. Это лучший встроенный инструмент оракула для поиска этого материала в Java 8. От терминала...

ПРИМЕЧАНИЕ. Вам нужно запустить jcmd, поскольку любой пользователь начал процесс Java. Если вы отлаживаете такой веб-сервер, как Jetty, вам может потребоваться изменить пользователя с помощью sudo su jetty.

  • Выполнить jcmd
  • Возьмите PID, отображаемый для вашего приложения, и запустите jcmd <pid> VM.native_memory введите описание изображения здесь Это имеет
  • Для запуска дополнительных опций jcmd <pid> help