2015-06-23 12 views
7

Java 8 używa metaprzestrzeń, która jest w stanie dynamicznie się rozwijać. GC będzie działał na metaprzestrzeni, gdy się zapełni. Czy to oznacza, że ​​GC nigdy nie uruchomi się w metaprzestrzeni?Jawa 8 Dowiedz się rozmiar metaprzestrzeni w czasie wykonywania

Moja aplikacja Java 8 używa dużo pamięci. Chciałbym wiedzieć, jaki jest rozmiar mojej metaprzestrzeni w czasie wykonywania. Jak mogę to zrobić?

Mam na myśli ustawienie maxMetaSpace. Co powinienem ustawić? Wszelkie zalecenia?

Odpowiedz

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

} 

Tak lepiej jest ustawić maxMetaspace jeśli uważasz, że jest nieszczelny monitorować i naprawić

6

Wariant 1:

Execute

jstat -gc PID 

(z PID zastąpiony przez PID JVM do monitorowania), który powróci sth. jak:

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 

Według this zainteresowania to:

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

Więc w tym przypadku około 181mb z Metaspace zostały popełnione podczas 137mb są wykorzystywane obecnie.

Opcja 2:

Jeśli masz włączone logi zbierania śmieci można również znaleźć to stamtąd, np po awarii aplikacji lub zgłoszeniu problemu. Szukaj linii jak

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] 

Stanowi to zmianę rozmiaru na Metaspace Jako że zostało osiągnięte poprzedni próg.

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

zawiera odpowiednie informacje: 34,9 miliona był używany przed, jak również po GC. Najnowsze znalezione wpisy dziennika pokaże aktualny rozmiar (po GC).

Należy pamiętać, że pełne GC jest uruchamiane po zmianie rozmiaru Metaspace. Dobrym pomysłem jest więc skonfigurowanie dobrej wartości początkowej, gdy już wiesz, że domyślna wartość ~ 21mb (w zależności od konfiguracji hosta) nie jest wystarczająca.

Aby uzyskać więcej informacji na temat dostrajania rozmiaru Metaspace, patrz this.

+1

'man jstat' daje poprawne interpretacje„MC : Pojemność metaprzestrzeni (kB) "i" MU: Wykorzystanie metaprzestrzeni (kB) ", a nie" zatwierdzone "i" użyte ". – moxn

1

Użyj jcmd. Jest to najlepsze wbudowane narzędzie Oracle do znajdowania tych rzeczy w języku Java 8. Od terminala ...

UWAGA: należy uruchomić jcmd, niezależnie od tego, kto rozpoczął proces java. Jeśli debugujesz serwer WWW taki jak Jetty, być może będziesz musiał zmienić użytkownika na coś podobnego do sudo su jetty.

  1. Run jcmd
  2. Take PID wyświetlane dla aplikacji i uruchom jcmd <pid> VM.native_memory enter image description here Ma
  3. uzyskać więcej opcji uruchomienia jcmd <pid> help
Powiązane problemy