2013-12-14 7 views
5

Ich werde besser erklären:Ist Java automatisch Heap erhöhen "transparent" oder es kostet?

ist es vorzuziehen, Satz mit -Xms <> Parameter JVM die erwartete Speicher oder es ist besser, es in automatischen zu verlassen? Ich meine, wenn ich weiß, dass meine Anwendung mindestens 500 MB RAM und maximal 1 GB (verwendete Zufallszahlen) verwenden wird, wäre es besser, den Parameter auf die JVM zu setzen? Ich weiß, dass, wenn Sie einen größeren Heap haben, die Konsequenz ist, dass Sie längere Wartezeit haben, aber wenn der Heap fast fertig ist, sollte die JVM den belegten Speicher verlagern (wertvolle Zeit verlieren)?

graph http://upperpix.com/di-F0LD.png

+1

http://stackoverflow.com/questions/15338261/optimizing-java-application-using-xms-and-xmx – assylias

+0

Wie viel Zeit verlieren Sie genau? – Ingo

+0

Da Benchmarking der JVM nicht so einfach ist (Warm-up) weiß ich nicht, ob das Ergebnis gut ist oder nicht. Es hängt natürlich vom Algorithmus ab, aber beim Stand der Technik kann ich Ihnen nicht mit korrekten Daten antworten – BlacK

Antwort

2

Der Prozess des Heap-Erweiterung hat die Leistung auswirken. Die Auswirkungen hängen jedoch davon ab, über welche Art von Leistung Sie sprechen.

Ein Leistungskriterium ist der Prozentsatz der Prozessorzeit, die ausgegeben wird, um "Garbage Collection" durchzuführen; d.h. "Durchsatz". Die für den Durchsatz optimierten GCs funktionieren am besten mit einem großen Heap. In diesem Fall sagt eine einfache Analyse, dass Sie den Heap besser auf die Größe vorziehen, die Sie für erforderlich halten ... anstatt klein zu beginnen und sich auf den GC zu verlassen, um den Heap zu erweitern.

Ein weiteres Leistungskriterium ist die Pausenzeit. Das Verhalten von Kollektoren mit "niedriger Pause" ist jedoch zu kompliziert für den obigen vereinfachten Analysestil. (Und ich weiß nicht, wie es in der Praxis funktioniert ...)


Es gibt einen Aspekt, der auf der ganzen Linie gilt. Unter der Annahme, dass die Heap-Nutzung der Anwendung einen (ungefähr) stabilen Zustand erreicht und angenommen wird, dass sie diesen Zustand zu einem frühen Zeitpunkt der JVM erreicht, werden die verschiedenen Performance-Overheads benötigt, um diesen stationären Zustand zu erreichen) wird dazu neigen, unbedeutend zu sein.