2015-06-23 2 views
7

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

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

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

ответ

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

} 

Да лучше установить maxMetaspace, если вы считаете, что негерметичных контролировать и фиксировать его

6

Вариант 1:

Execute

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 

По this интереса являются:

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

Так что в этом случае около 181mb в Метапространстве совершаются в то время как 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 (в зависимости от конфигурации хоста) недостаточно.

См. this для получения дополнительной информации о настройке размера метаданных.

+1

'человек jstat' дает правильные интерпретации«MC : Емкость метапроцесса (kB) »и« MU: использование метакласса (kB) », а не« совершенные »и« используемые ». – moxn

1

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

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

  1. Run jcmd
  2. Возьмите PID отображается для вашего приложения и запустить jcmd <pid> VM.native_memory enter image description here Это
  3. Для больше вариантов запуска jcmd <pid> help