2010-03-23 12 views
11

Die Java Virtual Machine unterstützt mehrere Garbage Collection-Strategien.Wie kann ich sehen, welche Garbage Collector Java verwendet

Diese article erklärt sie.

Jetzt frage ich mich, welche (automatisch gewählte) Strategie meine Anwendung verwendet, gibt es eine Möglichkeit, die JVM (Version 1.6) diese Informationen drucken zu lassen?

Bearbeiten: Die JVM erkennt, ob sie sich im Client- oder Servermodus befindet. Also ist die Frage wirklich, wie kann ich sehen, was entdeckt wurde?

+2

Beachten Sie, dass die Artikel spricht über ** eine spezifische Implementierung ** (speziell die HotSpot JVM von der Sonne JRE). –

+0

Ja, Sie haben Recht. – Thirler

+0

Bitte beachten Sie, dass Sie nicht unbedingt nur einen GC verwenden. Sie haben normalerweise unterschiedliche Strategien für verschiedene Bereiche. Wenn Sie CMS benutzen, denke ich, dass die Standardeinstellung darin besteht, eine "neue Parallele" für den jungen Bereich zu verwenden. – Fredrik

Antwort

13

http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html die für J2SE 6 als auch anwendbar ist, besagt, dass der Standard die Parallel Sammler.

Wir testeten diese einmal auf einer JVM 1.5 von nur

-server -Xms3g -Xmx3g -XX:PermSize=128m -XX:LargePageSizeInBytes=4m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

Einstellung und der Ausgang zeigte

 
41359.597: [GC [PSYoungGen: 90499K->32K(377344K)] 268466K->181862K(2474496K), 0.0183138 secs] 
41359.615: [Full GC [PSYoungGen: 32K->0K(377344K)] [PSOldGen: 181830K->129760K(2097152K)] 181862K->129760K(2474496K) [PSPermGen: 115335K->115335K(131072K)], 4.4590942 secs] 

wo PS für Parallel Scavenging steht

0

Was ist mit den Informationen der Befehlszeilenoptionen -verbose: gc und -XX: + PrintGCDetails? Ist es nicht hilfreich?

[Edit: Offensichtlich nicht]

+0

Es wird nicht gedruckt, welcher Garbage Collector verwendet wird. – Thirler

4

Wie Joachim bereits darauf hingewiesen, die Der Artikel, auf den Sie verweisen, beschreibt die von Suns VM angebotenen VM-Strategien. Die VM-Spezifikation selbst schreibt keine spezifischen GC-Algorithmen vor und daher ist es nicht sinnvoll, z. Aufzählungswerte für diese in der API.

Sie können jedoch einige Infos aus der Management-API erhalten:

List<GarbageCollectorMXBean> beans = 
    ManagementFactory.getGarbageCollectorMXBeans(); 

Iterieren durch diese Bohnen, Sie den Namen des GC bekommen kann (wenn auch nur als String) und die Namen der Speicherpool, die von den verschiedenen GCs verwaltet werden.

13

jmap -heap

Druckt einen Haufen Zusammenfassung. Der verwendete GC-Algorithmus, die Heap-Konfiguration und die generationsorientierte Heap-Nutzung werden gedruckt.

http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

+0

Genau das brauche ich, leider ist es unter Windows nicht verfügbar (keine Ahnung warum). – Thirler

+0

Vielleicht sollten Sie diese Information (Windows) zur Frage hinzufügen;) – fglez

7

Setzen Sie dieses in den JAVA_OPTS:

-XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

Für die UseSerialGC wir im Protokoll sehen:

7.732: [GC 7.732: [DefNew: 419456K->47174K(471872K), 0.1321800 secs] 419456K->47174K(1520448K), 0.1322500 secs] [Times: user=0.10 sys=0.03, real=0.14 secs] 

Für die UseConcMarkSweepGC werden wir sehen, in das Protokoll:

5.630: [GC 5.630: ['ParNew: 37915K->3941K(38336K), 0.secs] 78169K->45163K(1568640K), 0.0124030 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

Für die UseParallelGC wir sehen werden im Protokoll:

30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs] 
1

Sie einfach Progamm schreiben können, die über JMX auf Ihre Java-Prozess verbindet: wir wie

public class PrintJMX { 
    public static void main(String[] args) throws Exception { 
    String rmiHostname = "localhost"; 
    String defaultUrl = "service:jmx:rmi:///jndi/rmi://" + rmiHostname + ":1099/jmxrmi"; 
    JMXServiceURL jmxServiceURL = new JMXServiceURL(defaultUrl); 

    JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL); 
    MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection(); 


    ObjectName gcName = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*"); 

    for (ObjectName name : mbsc.queryNames(gcName, null)) { 
     GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(mbsc, 
     name.getCanonicalName(), 
     GarbageCollectorMXBean.class); 

     System.out.println(gc.getName()); 
    } 

    } 
} 
4

Sieht aus, haben eine bequemere Möglichkeit, die Version von GC zur Laufzeit zu definieren. Benutze immer Werkzeuge, mein Vorschlag. GC-Version definieren wir zwei Werkzeuge benötigen, die mit JVM kommen (in Ihrem jdk/bin Verzeichnis abgelegt):

  1. VisualVM - starten Sie es und versuchen, einen Prozess zum Profil (zum Beispiel Sie können VisualVM Profil selbst). Ihr Profil zeigt Ihnen eine PID des Prozesses (siehe die grünen Rechtecke bei einem Screenshot).
  2. jMap - dieses Tool mit -heap <PID> Optionen starten und eine Reihe gewidmet einem Garbage-Collector-Typ (siehe eine rosa Linie auf einem Screenshot)

enter image description here

1

Der beste Weg, dies zu umgehen zu finden ist: Go Geben Sie den Befehl "Line" ein und geben Sie den folgenden Befehl ein.

java -XX: + PrintCommandLineFlags -Ausführung

Es zeigt Ihnen führen wie:

C:\windows\system32>java -XX:+PrintCommandLineFlags -version 
-XX:InitialHeapSize=132968640 -XX:MaxHeapSize=2127498240 -XX:+PrintCommandLineFl 
ags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesInd 
**ividualAllocation -XX:+UseParallelGC** 
java version "1.8.0_66" 
Java(TM) SE Runtime Environment (build 1.8.0_66-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)`enter code here` 
Verwandte Themen