Java - Müllsammlung

Hallo dort, zukünftige Java-Zauberer! Heute werden wir eine spannende Reise in die Welt der Java-Müllsammlung antreten. Keine Sorge, wenn du neu bei der Programmierung bist – ich werde dein freundlicher Guide sein, und wir werden dieses Thema Schritt für Schritt erkunden. Also, nimm deinen virtuellen Besen und lass uns etwas Speicher aufräumen!

Java - Garbage Collection

Was ist Java-Müllsammlung?

Stell dir vor, du bist auf einer nie endenden Party (klingt nach Spaß, nicht wahr?). Während die Leute sich amüsieren, lassen sie überall leere Teller und Gläser liegen. Bei einer normalen Party müsstest du manuell aufraumen. Aber was wäre, wenn es ein magisches Reinigungssystem geben würde, das die Müll自动atisch entfernt, ohne dass du es sogar bemerkst? Das ist grundsätzlich das, was die Java-Müllsammlung für deine Programme leistet!

In programmiererischer Sprache ist die Müllsammlung (GC) ein automatisches Speicherverwaltungssystem. Es identifiziert Objekte in einem Java-Programm, die nicht mehr benötigt werden, und entfernt sie, um Speicher freizumachen. Dieser Prozess happens im Hintergrund, wodurch Entwickler sich auf das Schreiben von Code konzentrieren können, anstatt den Speicher manuell zu verwalten.

Sehen wir uns ein einfaches Beispiel an:

public class GarbageCollectionExample {
public static void main(String[] args) {
// Erstelle ein neues Objekt
String name = new String("John Doe");

// Die Variable 'name' zeigt jetzt auf null
name = null;

// An diesem Punkt ist das ursprüngliche "John Doe" String-Objekt
// för Müllsammlung geeignet

// schlage vor, Müllsammlung durchzuführen (garantiert nicht)
System.gc();
}
}

In diesem Beispiel erstellen wir ein String-Objekt "John Doe" und weisen es der Variablen 'name' zu. Wenn wir 'name' auf null setzen, wird das ursprüngliche String-Objekt nicht mehr erreichbar. Der Müllsammler wird dieses Objekt schließlich bereinigen und den von ihm belegten Speicher freigeben.

Arten von Müllsammlern

Java bietet mehrere Arten von Müllsammlern, jeder mit eigenen Stärken. Es ist wie verschiedene Arten von Reinigungstrupps für verschiedene Situationen zu haben. Lass uns unsere Reinigungsteams kennenlernen:

  1. Serieller Müllsammler
  2. Parallel Müllsammler
  3. Concurrent Mark Sweep (CMS) Müllsammler
  4. G1 Müllsammler

Hier ist eine praktische Tabelle, die diese Sammler zusammenfasst:

Müllsammler Best For Schlüsselmerkmal
Serieller GC Einfachthreaded-Umgebungen, kleine Datensätze Einfach und effizient für kleine Anwendungen
Parallel GC Multithreaded-Umgebungen, große Datensätze Fokusiert sich auf Durchsatz
CMS GC Anwendungen, die niedrige Pausenzeiten erfordern Konkurrenzoperation zur Minimierung von Pausen
G1 GC Große Heap-Größen, vorhersehbare Pausenzeiten Teilt den Heap in Regionen für eine effiziente Sammlung

Generationen in der Müllsammlung

Nun, lassen Sie uns darüber sprechen, wie Java Objekte für die Müllsammlung organisiert. Java verwendet ein generationales Müllsammlungsmodell, das auf der Beobachtung basiert, dass die meisten Objekte eine kurze Lebensdauer haben.

Der Heap (wo Objekte leben) ist in drei Generationen unterteilt:

  1. Junge Generation
  2. Alte Generation (auch genannt Tenured Generation)
  3. Permanente Generation (ersetzt durch Metaspace in Java 8+)

Hier ist eine lustige Art, darüber nachzudenken: Stell dir eine Stadt mit drei Stadtteilen vor - Youngstown, Oldville und Permanentburg.

Junge Generation (Youngstown)

Dies ist der Ort, an dem neue Objekte geboren werden. Es ist ein geschäftiger, dynamischer Ort mit einer hohen Umsatzrate. Die meisten Objekte leben und sterben hier, ohne jemals in andere Bereiche zu ziehen.

Die Junge Generation ist weiter in drei Räume unterteilt:

  • Eden Space: Wo neue Objekte zugeordnet werden.
  • Überlebenden Raum 0 und Überlebenden Raum 1: Wo Objekte, die eine Müllsammlung überleben, verschoben werden.

Sehen wir uns ein Beispiel der Objekterstellung in der Jungen Generation an:

public class YoungGenerationExample {
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
// Diese Objekte werden im Eden-Speicher der Jungen Generation erstellt
Object obj = new Object();
}
// Die meisten dieser Objekte werden in der nächsten Minor GC gesammelt
}
}

In diesem Beispiel erstellen wir 1000 Objekte. Diese werden initially im Eden-Speicher der Jungen Generation zugeordnet.

Alte Generation (Oldville)

Objekte, die mehrere Müllsammlungen in der Jungen Generation überleben, werden in die Alte Generation befördert. Es ist wie eine Rentnergemeinschaft für langlebige Objekte.

Hier ist ein Beispiel eines Objekts, das möglicherweise in die Alte Generation gelangt:

public class OldGenerationExample {
private static final ArrayList<String> longLivedList = new ArrayList<>();

public static void main(String[] args) {
for (int i = 0; i < 100000; i++) {
longLivedList.add("Item " + i);
// Diese Liste wird wahrscheinlich in die Alte Generation befördert,
// da sie wächst und mehrere GC-Zyklen überlebt
}
}
}

In diesem Fall wird longLivedList wahrscheinlich in die Alte Generation befördert, da sie wächst und mehrere Müllsammlungszyklen überlebt.

Minor Müllsammlung

Minor GC ist wie ein schneller Aufräumvorgang von Youngstown. Es ist schnell und happens häufig. Wenn die Junge Generation voll ist, schlägt die Minor GC ein, um sie aufzuräumen.

Hier ist, was während einer Minor GC passiert:

  1. Alle Objekte in Eden werden in einen der Überlebenden-Räume verschoben.
  2. Objekte aus dem aktuellen Überlebenden-Raum werden in den anderen Überlebenden-Raum verschoben.
  3. Objekte, die mehrere Minor GC überlebt haben, werden in die Alte Generation befördert.

Vollständige Müllsammlung

Eine vollständige Müllsammlung ist ein gründlicherer Aufräumvorgang, der sowohl Youngstown als auch Oldville abdeckt. Es ist langsamer und weniger häufig als die Minor GC.

Eine vollständige GC wird ausgelöst, wenn:

  • Die Alte Generation voll ist
  • Der Metaspace voll ist

Hier ist ein Beispiel, das möglicherweise eine vollständige GC auslöst:

public class FullGCExample {
public static void main(String[] args) {
List<byte[]> list = new ArrayList<>();
while (true) {
// Continuously allocate memory
byte[] b = new byte[1024 * 1024]; // 1MB
list.add(b);
}
}
}

Dieses Programm allokiert kontinuierlich Speicher, ohne ihn freizugeben. Schließlich wird es die Alte Generation füllen und eine vollständige GC auslösen.

Müllsammler einstellen

Das Einstellen von Müllsammlern ist wie das Feintuning deines Reinigungsschemas. Es ist ein fortgeschrittenes Thema, aber hier sind einige grundlegende Tipps:

  1. Wähle den richtigen Sammler für deine Anwendung
  2. Passen Sie die Heap-Größe und Generationen-Größen an
  3. Setzen Sie geeignete GC-Protokollierung

Hier ist ein Beispiel, wie man den Müllsammler und die Heap-Größe bei der Ausführung einer Java-Anwendung einstellt:

java -XX:+UseG1GC -Xmx4g -Xms4g MyApplication

Dieser Befehl verwendet den G1 Müllsammler und setzt sowohl die maximale als auch die anfängliche Heap-Größe auf 4GB.

Denke daran, dass das Einstellen der Müllsammlung stark von deiner spezifischen Anwendung und Umgebung abhängt. Es ist oft ein Prozess der Experimentierung und Überwachung.

Und da hast du es, meine lieben Studenten! Wir haben eine rasante Tour durch die Java-Müllsammlung gemacht. Von der Understanding, was sie ist, über die Untersuchung verschiedener Arten von Sammlern und Generationen, bis hin zur Arbeit von Minor und Full GC, bist du jetzt mit den Grundlagen dieses wichtigen Aspekts der Java-Programmierung ausgestattet.

Denke daran, dass die Müllsammlung wie ein aufopferungsvoller Reinigungstrupp ist, der im Hintergrund deiner Java-Programme arbeitet. Während er seine Arbeit tut, kannst du dich auf das Schreiben erstaunlicher Code konzentrieren. Frohes Coden und möge dein Speicher immer sauber und ordentlich sein!

Credits: Image by storyset