2015-06-23 19 views
7

Java 8 verwendet Metaspace, das dynamisch erweitert werden kann. GC wird im Metaspace ausgeführt, wenn es voll wird. Bedeutet das, GC wird nie auf Metaspace laufen?Java 8 Ermitteln der Größe des Metaspaces zur Laufzeit

Meine Java 8-Anwendung verwendet eine Menge Speicher. Ich würde gerne wissen, wie groß der Metaspace zur Laufzeit ist. Wie mache ich das?

Ich denke über die Einstellung MaxMetaSpace. Was soll ich einstellen? Irgendwelche Empfehlungen?

Antwort

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

} 

Ja, es ist besser maxMetaspace zu setzen, wenn Sie denken, es undicht ist zu überwachen und zu beheben

6

Option 1:

Execute

jstat -gc PID 

(mit PID ersetzt durch die PID der JVM zu überwachen), die etw. wie:

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 

Nach this von Interesse sind:

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

Also in diesem Fall über 181mb von metaSpace sind verpflichtet, während 137mb derzeit verwendet werden.

Option 2:

Wenn Sie Garbage Collection-Protokolle aktiviert Sie können diese auch von dort herausfinden, z.B. nachdem die Anwendung bereits abgestürzt ist oder ein Problem gemeldet wurde. Suche nach Zeilen wie

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] 

Dies stellt eine Redimensionierung des metaSpace als der vorherige Grenzwert erreicht wurde.

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

enthält die relevanten Informationen: 34,9mb wurden vor als auch nach GC verwendet. Der letzte dieser Protokolleinträge, die Sie finden können, zeigt die aktuelle Größe (dh nach GC).

Beachten Sie, dass der vollständige GC ausgeführt wird, wenn Metaspace in der Größe geändert wird. Es ist also eine gute Idee, einen guten Startwert dafür zu konfigurieren, wenn Sie bereits wissen, dass der Standardwert von ~ 21 MB (abhängig von der Host-Konfiguration) nicht ausreicht.

Weitere Informationen zur Optimierung der Metaspace-Größe finden Sie unter this.

+1

'man jstat' die richtigen Interpretationen von„MC gibt : Metaspace-Kapazität (kB) "und" MU: Metacspace-Auslastung (kB) ", nicht" committed "und" used ". – moxn

1

Verwenden Sie jcmd. Es ist das beste eingebaute oracle Werkzeug, zum dieses Zeugs in Java 8 zu finden. Vom Terminal ...

ANMERKUNG: Sie müssen jcmd als irgendein Benutzer laufen lassen, der den Java-Prozess startete. Wenn Sie einen Webserver wie Jetty debuggen, müssen Sie möglicherweise Benutzer mit etwas wie sudo su jetty ändern.

  1. Run jcmd
  2. die PID Nehmen Sie für Ihre App angezeigt und laufen jcmd <pid> VM.native_memory enter image description here Dies hat
  3. Weitere Optionen laufen jcmd <pid> help
Verwandte Themen