2016-09-09 4 views
0

Ich versuche, ein Problem zu umgehen, das mich für eine Weile nervt. Zusammenfassend: Auf welcher Basis sollte man einen maximalen Heap-Platz für die Resource-Hogging-Anwendung zuweisen und gibt es einen Nachteil, dass der Tit zu groß ist?Wie man richtig großen Heap-Platz für JVM zuweist

Ich habe eine Anwendung verwendet, um große medizinische Daten zu visualisieren, die bis zu mehrere Gigabyte Speicher essen können, wenn mehrere Imaging-Volumes nebeneinander geöffnet werden. Zwischenspeichern der zu betrachtenden Daten ist für einen reibungslosen Arbeitsablauf unerlässlich. Die Software wird von Windows-Workstations unterstützt und mit einem Bootloader gestartet, der die Heap-Größe zuweist und die Hauptanwendung startet. Der tatsächliche Arbeitsspeicher, der von der Hauptanwendung benötigt wird, ist direkt proportional zu den Daten, die angezeigt werden, und kann vom Bootloader nicht bestimmt werden, da dies das Lesen der Daten erfordern würde, was letztendlich zu viel Zeit verbrauchen würde.

Um sicherzustellen, dass die JVM während des Starts genug Speicher hat, haben wir xmx so groß eingerichtet, wie wir es aufgrund des aktuellen Designs für den maximalen physischen Arbeitsspeicher der Workstation wagen. Aber gibt es da einen Nachteil? Ich habe gelesen (aus einem Beitrag von 2008), dass es für native Prozesse möglich ist, überschüssigen Heap-Speicher zu verschwenden, was während der Laufzeit zu Speicherfehlern führen kann. Sollte ich vielleicht auch vor der Zuweisung von Heap-Speicherplatz nach der Größe des freien virtuellen Speichers oder der Auslagerungsdatei suchen? Wie würdest du mit dieser Situation umgehen?

Oh, und dies ist meine erste Post zu diesen Foren. Schön, Sie alle zu treffen und sanft zu sein! :)

Update:

Danke für alle Antworten. Ich bin mir nicht sicher, ob ich meine Worte richtig formuliert habe, aber mein Problem ist, dass ich keine Ahnung von der Hardware habe, auf der diese Software ausgeführt wird, aber trotzdem so viel Heap-Speicherplatz für die Software wie möglich zuweisen möchte .

Ich kam zu einer Lösung der Zuweisung eines Heap von 70% des physikalischen Speichers, wenn genügend Menge an virtuellem Speicher zur Verfügung steht - weniger sonst.

+0

Besser, Ihre Daten in verschiedenen Redis Shards zwischenzuspeichern und Ihre Apps auf verschiedene jvm zu verteilen. Großer Haufen wird nicht empfohlen. – neohope

+0

Etwas verwandt: http://stackoverflow.com/questions/39462735/how-to-make-jvm-use-the-max-all-remain-memory-of-a-server –

Antwort

0

Sie können Heap-Größen von etwa 28 GB mit geringer Auswirkung auf die Leistung haben, besonders wenn Sie große Objekte haben. (viele kleine Objekte können GC-Pausenzeiten beeinflussen)

Heap-Größen von 100 GB sind möglich, haben aber Downside, meist weil sie hohe Pausenzeiten haben können. Wenn Sie Azul Zing verwenden, kann es viel größere Heap-Größen wesentlich eleganter verarbeiten.

Die Hauptbeschränkung ist die Größe Ihres Speichers. Wenn Sie den Heapspeicher überschreiten, werden Ihre Anwendung und Ihr Computer sehr langsam/unbrauchbar ausgeführt.

Ein Standard Weg um diese Probleme mit Mapping-Software (die in der Lage sein, die ganze Welt zum Beispiel zu kartieren) ist, ist es Ihre Bilder in Kacheln brechen. Auf diese Weise wird nur das Bild angezeigt, das den Bildschirm darstellt (oder Teile, die sich auf dem Bildschirm befinden). Wenn Sie zoomen können, müssen Sie möglicherweise Daten auf zwei bis vier Skalierungsebenen speichern. Mit diesem Ansatz können Sie eine Karte der ganzen Welt auf Ihrem Telefon anzeigen.

0

Es ist am besten, JVM max Speicher aus zwei Hauptgründen nicht auf mehr als 60-70% des Workstationspeichers zu setzen, in einigen Fällen sogar niedriger. Erstens kann das, was die JVM auf der physischen Maschine verbraucht, aufgrund der GC-Mechanik 20% oder mehr größer als der Heap sein. Zweitens ist die Darstellung einer bestimmten Datenentität im JVM-Heap möglicherweise nicht die einzige physische Kopie dieser Entität im RAM der Maschine, da das Betriebssystem Caches und Puffer usw. um die verschiedenen IO-Devices herum besitzt, von denen es diese Objekte ergreift.

Verwandte Themen