Finden Sie heraus, welche Art von Garbage Collector ausgeführt wird

Lesezeit: 1 Minute

Die Ergonomie nach JSE 5 soll (unter anderem) automatisch den geeigneten Garbage-Collector-Typ für Sie auswählen.

Ich würde gerne wissen, ob es eine Möglichkeit gibt, den Typ des Garbage Collectors und die von der JVM-Ergonomie gewählten/aktuellen Leistungsziele zu bestätigen/zu kennen.

  • war neugierig auf Ergonomie, speziell für GC, und wollte sie in Aktion sehen – bevor er Empfehlungen für die Produktion erstellte; versuchte jvisualvm, keine Freude.

    – Ryan Fernandes

    17. Februar 2011 um 4:36 Uhr

Benutzer-Avatar
Darren

java -XX:+PrintCommandLineFlags -version

zeigt Ihnen den Standard-Garbage Collector. Ich habe auch die folgende Seite nützlich gefunden, die beschreibt den standardmäßigen Garbage Collector für verschiedene Betriebssysteme.

  • Ich sehe keine Garbage Collector-bezogenen Flags/Informationen in der Ausgabe dieses Befehls. Ich verwende Windows 7 mit Java 1.8.0_45.

    – Null3

    15. Mai 2015 um 2:58 Uhr


  • @Zero3 na ja, was tun Siehst du?

    – Thorbjørn Ravn Andersen

    29. Juni 2015 um 12:35 Uhr

  • Dies zeigt die Befehlszeilenargumente, die mit jvm verwendet werden, zeigt jedoch nicht den verwendeten Garbage Collector: [[email protected] ~]$ java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=2018388928 -XX:MaxHeapSize=32210157568 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode) Die Antwort von Eric Wang hat bei mir funktioniert

    – Liltitus27

    3. Juli 2018 um 14:50 Uhr


  • Hier falsche Antwort. Bietet keine Lösung.

    Benutzer2587965

    3. Dezember 2018 um 16:11 Uhr

  • @liltitus27 Sie sollten nach möglichen Werten suchen: +UseParallelGC, +UseSerialGC, +UseConcMarkSweepGC, …, siehe docs.oracle.com/javase/10/gctuning/… für mich muss diese Antwort als gültig akzeptiert werden.

    – Lorenzo Solano Martínez

    14. August 2019 um 0:50 Uhr

Benutzer-Avatar
Erich

(Zum Java <= 8)

Dieser Befehl gibt den GC-Typ einer laufenden JVM aus:

jmap -heap <pid> | grep GC

Für moderne Computer (mehrere CPUs, großer Speicher) erkennt JVM ihn als Servermaschine und verwendet ihn Parallel GC standardmäßig, es sei denn, Sie geben explizit an, welcher GC über JVM-Flags verwendet werden soll.

z.B

jmap -heap 26806 | grep GC

Ausgabe:

Parallele GC mit 8 Threads


@Update – für Java 9+

(Dank an @JakeRobbKommentar von .)

Seit Java 9 gibt es 2 Änderungen, die für diese Frage relevant sind:

  • Brauchen Sie zu verwenden jhsdb an einen Java-Prozess anhängen oder einen Debugger starten.
    Verweisen: jhsdb
  • Der Standard-GC wird geändert in G1.

Befehlsformat:

jhsdb jmap --heap --pid <pid> | grep GC

z.B

jhsdb jmap --heap --pid 17573 | grep GC

Ausgabe:

Garbage-First (G1) GC mit 8 Threads

  • Dies sollte die akzeptierte Antwort sein. Verwenden Sie für Java 9 und höher jhsdb jmap --heap --pid <pid> | grep GC.

    – Jake Robb

    22. Februar 2019 um 15:17 Uhr


  • Wenn jemand wie ich einen Fehler erhält – Unterstützte Versionen sind Ziel-VM ist , verwenden Sie das jdk-Installationsverzeichnis, um den obigen Befehl auszuführen, z. B. – /bin/jmap -heap | grep GC (natürlich für <=Java8)

    – NIVESH SENGAR

    10. Oktober 2020 um 8:54 Uhr


  • Ich habe aus irgendeinem Grund einen Fehler bei der Ausführung auf JDK 11 erhalten. Stattdessen, jcmd <pid> VM.flags hat die GC-Informationen gemeldet, nach denen ich gesucht habe.

    – Michael R

    21. Februar 2021 um 21:44 Uhr

import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;

public class GCInformation {

    public static void main(String[] args) {
            try {
                    List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();

                    for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
                            System.out.println(gcMxBean.getName());
                            System.out.println(gcMxBean.getObjectName());
                    }

            } catch (RuntimeException re) {
                    throw re;
            } catch (Exception exp) {
                    throw new RuntimeException(exp);
            }
    }
}

Versuchen Sie zB die folgenden Befehle, um verschiedene GC-Typen zu kennen

java -XX:+PrintCommandLineFlags  GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseParallelGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:+UseParNewGC GCInformation
java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -XX:-UseParNewGC GCInformation

Benutzer-Avatar
Lucas Zamboulis

Keine direkte Antwort auf Ihre Frage, aber ich glaube, das ist, wonach Sie suchen.

Entsprechend Java6 Dokumentation 1 und 2 (nicht nur Java 5):

Bezug 1 sagt:

Auf Maschinen der Serverklasse, auf denen die Server-VM ausgeführt wird, hat sich der Garbage Collector (GC) gegenüber dem vorherigen seriellen Collector geändert […] zu einem Parallelkollektor

Bezug 2 sagt:

Ab J2SE 5.0 kann der Launcher beim Start einer Anwendung versuchen zu erkennen, ob die Anwendung auf einer Maschine der „Serverklasse“ ausgeführt wird, und in diesem Fall die Java HotSpot Server Virtual Machine (Server-VM) anstelle von Java verwenden Virtuelle HotSpot-Client-Maschine (Client-VM).

Auch Referenz 2 sagt:

Hinweis: Für Java SE 6 ist die Definition einer Maschine der Serverklasse eine Maschine mit mindestens 2 CPUs und mindestens 2 GB physischem Arbeitsspeicher.

Anhand dieser Informationen können Sie erkennen, dass es sich bei der Box um einen Server handelt (lt 2), dann wird es den parallelen GC verwenden. Sie können auch schlussfolgern, dass GC während der Laufzeit nicht geändert wird.

Sie können wahrscheinlich die richtige Antwort für Nicht-Server-Computer finden, wenn Sie weiter in der Dokumentation graben.

-XX:+PrintGC
-XX:+PrintGCDetails

Dadurch wird gedruckt, welche GC verwendet wird. In meinem Fall druckt es:

[GC (Allocation Failure) [PSYoungGen: 348192K->32K(348672K)] 356792K->8632K(1048064K), 0.0111518 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

Was bedeutet, dass die Paralleler Müll Collector wird für die junge Generation genutzt. “Zuweisungsfehler” bedeutet, dass die Garbage-Collection gestartet wurde, weil im Heap-Teil der jungen Generation nicht genügend Platz vorhanden war.

  • Ich habe das Gefühl, dass diese Antwort unvollständig ist. Welcher Teil dieses Ausdrucks weist auf den Parallelkollektor hin? Wie rufen Sie das auch für eine laufende JVM auf?

    – Jake Robb

    22. Februar 2019 um 15:16 Uhr

  • PS steht für Parallel Scavenge. docs.oracle.com/javase/jp/8/docs/serviceabilityagent/sun/jvm/… . Sie können diese Parameter an einen neuen Java-Prozess übergeben, den Sie starten, was bedeutet, dass Sie sie nicht auf bereits laufende Prozesse anwenden können.

    – Alex T

    24. Februar 2019 um 20:24 Uhr

  • In diesem Fall denke ich, dass die Antwort von Eric Wang besser ist, da Sie sie gegen eine laufende JVM aufrufen und nicht davon ausgehen, dass Sie unmöglich generische Abkürzungen wie „PS“ übersetzen können. 🙂

    – Jake Robb

    24. Februar 2019 um 20:45 Uhr

Benutzer-Avatar
Woody Sonne

Sie könnten die folgenden VM-Argumente mit JDK 14 verwenden:

-Xlog:gc -Xlog:gc*

Das Protokoll wird sein:

[0.008s][info][gc,heap] Heap region size: 1M
[0.008s][info][gc,heap,coops] Heap address: 0x0000000700000000, size: 4096 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
[0.011s][info][gc           ] Using G1
[0.011s][info][gc,cds       ] Mark closed archive regions in map: [0x00000007bff00000, 0x00000007bff7aff8]
[0.011s][info][gc,cds       ] Mark open archive regions in map: [0x00000007bfe00000, 0x00000007bfe50ff8]
[0.027s][info][gc           ] Periodic GC disabled

  • Ich habe das Gefühl, dass diese Antwort unvollständig ist. Welcher Teil dieses Ausdrucks weist auf den Parallelkollektor hin? Wie rufen Sie das auch für eine laufende JVM auf?

    – Jake Robb

    22. Februar 2019 um 15:16 Uhr

  • PS steht für Parallel Scavenge. docs.oracle.com/javase/jp/8/docs/serviceabilityagent/sun/jvm/… . Sie können diese Parameter an einen neuen Java-Prozess übergeben, den Sie starten, was bedeutet, dass Sie sie nicht auf bereits laufende Prozesse anwenden können.

    – Alex T

    24. Februar 2019 um 20:24 Uhr

  • In diesem Fall denke ich, dass die Antwort von Eric Wang besser ist, da Sie sie gegen eine laufende JVM aufrufen und nicht davon ausgehen, dass Sie unmöglich generische Abkürzungen wie „PS“ übersetzen können. 🙂

    – Jake Robb

    24. Februar 2019 um 20:45 Uhr

Benutzer-Avatar
Brett Kail

Verwenden Sie die GarbageCollectorMXBeans zu erhalten MemoryPoolMXBeans.

  • Nun, das gibt Ihnen nicht wirklich den verwendeten GC. Interessanterweise meldet die „getVMOption“-Ausgabe für UseSerialGC, UseParallelOldGC, UseParallelGC, UseConcMarkSweepGC jedoch alle „false“.

    – Ryan Fernandes

    21. Februar 2011 um 6:56 Uhr

  • Entschuldigung, ich hätte es vor dem Posten versuchen sollen :-(. Ich dachte, ich hätte es in der Vergangenheit dafür verwendet …

    – Brett Kail

    22. Februar 2011 um 23:27 Uhr

  • Dies sollte Ihnen die GCs geben, die möglicherweise gegen die JVM ausgeführt werden, indem Sie die collectionCount-Attribute beobachten, können Sie sehen, ob sie verwendet werden.

    – Matthew Buckett

    16. Januar 2012 um 23:05 Uhr

1179970cookie-checkFinden Sie heraus, welche Art von Garbage Collector ausgeführt wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy