2009-04-13 2 views

Antwort

9

Ja, die meisten Java-Garbage Collectors werden nur nach Bedarf ausgeführt, im Gegensatz zu einem Zeitplan, der ausgeführt werden muss, ob er benötigt wird oder nicht. Im Allgemeinen verursacht mehr Speicher weniger häufige, längere Speicherbereinigungen.

Die generationellen Müllsammler haben settings to control the allocation of memory between the young and tenured generations. Durch die Einstellung dieser, um einen kleineren Anteil des Gesamtspeichers für die junge Generation zu verwenden, kann die absolute Größe der jungen Generation gleich gehalten werden, wie die gesamte Heap-Größe erhöht wird. Dann werden Sie nicht viel von einer Änderung in Häufigkeit oder Dauer der Müllsammlung — sehen, aber Sie werden mehr Platz für langlebige Objekte für Anwendungen wie Caching haben.

4

Die allgemeine Antwort ist, dass Müll eher weniger gesammelt wird, aber die GC-Pausen werden tendenziell länger sein.

Vorausgesetzt, Sie haben bereits mehr Arbeitsspeicher für die VM als die Größe Ihres Arbeitssatzes; Andernfalls verbringen Sie möglicherweise viel Zeit in der Garbage Collection.

Die GC-Eigenschaften variieren stark, je nachdem, welchen Collector Sie verwenden und welche Version von Java und ob Sie zusätzlich zur höheren -Xmx eine höhere -Xms angegeben haben. Ältere Versionen von Java (vor 5) haben die Größe der jungen Generation nach der Initialisierung der VM nicht geändert. Selbst wenn Sie also einen wirklich großen Wert von -XMX angeben würden, wäre die Größe der jungen Generation immer noch sehr klein, so dass Sie häufig Sammlungen von jungen Generationen sehen würden.

Wenn eine Sammlung junger Generation stattfindet, wird es einige "junge" Objekte geben, die trotzdem in den festen Bereich befördert werden, obwohl sie kurzlebige Objekte sind. Dies bedeutet, dass sich die Dauergeneration langsam mit toten jungen Objekten füllt, was periodische vollständige GCs erfordert. Die Anzahl solcher Objekte, die in der Tenure Generation enden, ist proportional zur Anzahl der jungen GCs (unter der Annahme konstanter Aktivität in Ihrem Programm). Der Vorteil einer größeren jungen Generation besteht also darin, dass es weniger GCs für junge Generationen geben wird und daher weniger Objekte aus der jungen Kollektion in die Generation mit fester Anstellung aufgenommen werden.

Es gibt eine Reihe von Tuning-Parameter neben -Xmx (Google für Java GC), und Sie müssen mit ihnen experimentieren, da die optimalen Einstellungen für jede Anwendung variieren.

2

Ja, aber es hängt davon ab, welchen Garbage Collector Sie verwenden. Die GC tuning page ist eine gute Ressource für diese Art von Frage.

1

Es tut, denn wenn Sie mehr Speicher haben, wenn es darum geht, zu sammeln und zu komprimieren, hat es mehr zu scannen. Dies bedeutet, dass, wenn ein (vollständiger) GC eintritt, dies bedeutet, dass mehr Speicher gescannt werden muss und möglicherweise auch mehr Speicher komprimiert wird. Vielleicht können wir mit mehr Kontext weiter helfen. Es gibt offensichtlich drei verschiedene Abschnitte, die gescannt werden, daher korreliert es nicht notwendigerweise direkt in einem Sinn.

1

Nur indirekt und nach einer Weile laufen. -Xmx legt die MAXIMALE Größe fest, auf die der Heap wachsen darf, und wirkt sich nicht auf die anfängliche Größe aus. Daher wird es die GC-Zeit oder -Frequenz nicht früh während des Programmlaufs beeinflussen. Wenn der Heap nach einem GC immer noch (zu nah) voll ist, wird die Heapsize erhöht, und das ist, was -Xmx beeinflussen wird. Eine höhere Einstellung für -Xmx ermöglicht es, dass der Heap (eventuell) größer wird und somit weniger häufig Sammlungen ausgelöst werden (und diese Sammlungen werden länger dauern, wie andere beschrieben haben).

Wenn Ihre Anwendung jedoch nicht zu viel Arbeitsspeicher verwendet (der Heapspeicher ist nach einem GC also meistens leer), wird der Heapspeicher niemals vergrößert, und die Einstellung -Mx ist irrelevant.

Sie können -Xms verwenden, um die anfängliche GC-Heap-Größe festzulegen. Dies hat unmittelbare Auswirkungen auf Garbage Collections.