2010-08-04 9 views
9

Ich habe ein Java-Programm geschrieben, das die Geschwindigkeit einiger Multithreading-Algorithmen auf verschiedenen Rechnern mit verschiedenen Prozessorzahlen testet.dynamisch steigender Java-Heap-Bereich

Auf einigen Computern schlägt das Zusammenführen von sort * fehl, da ein umfangreicher Heap-Speicher für sehr große Arrays erforderlich ist. Ich kann den Java-Heap-Raum leicht selbst ändern, bevor ich das Programm ausführe, aber ich denke, ein robusterer und einfacherer Ansatz wäre, diese Aufgabe innerhalb des Programms selbst zu erledigen.

Gibt es eine Möglichkeit, im Verlauf eines Java-Programms mehr Heap-Speicher von der virtuellen Maschine anzufordern/zu erreichen?

Hinweis: Ich verstehe, dass ich das Programm mit einem Skript wie "Java-Xmx1g Program" ausführen konnte; meine Neugier auf dieses Thema ist zum Teil akademisch.

* Meine Implementierung wird NICHT inline zusammengeführt. Es erfordert O (n) zusätzlichen Speicher.

+0

Ich glaube nicht, dass das möglich ist. – helpermethod

Antwort

2

Java war nicht Design in der Lage, Speicher dynamisch zu verwalten, in diesem Fall "Java Heap Space", im Gegenteil, es wurde entwickelt, um den Programmierer davon zu befreien, sich darum kümmern zu müssen.

Kurz gesagt, ich habe Angst zu sagen, dass es in Java keine "malloc()" oder "setHeapSize(int byes)" gibt.

Auf Java sind Sie beschränkt auf die Menge an Speicher zur Verfügung JVM, wenn Ihr Programm startet. In Bezug auf die Speicherverwaltung ist dies sowohl ein Segen als auch ein Fluch.

Für diese Art von dynamischer Speicherzuweisung sollten Sie versuchen, Ihren Algorithmus mit einer Sprache wie C und/oder C++ zu implementieren.

+0

Erm, die Sun JVM für Windows ändert die Größe des Heapspeichers (d. H. Fordert oder gibt Speicher von/an das Betriebssystem zurück) innerhalb der durch -Xms und -Xmx angegebenen Grenzen. Sie können dies zum Beispiel in Visualvm sehen. – meriton

+0

Nun, das Schlüsselwort * neu * in Java ist praktisch gleichwertig mit malloc() in c, wie es in C++ ist. Aber danke; Das räumt auf. – Robz

+1

Sie mischen Konzepte. Die Tatsache, dass jemand die maximal verfügbare Heap-Größe dynamisch ändern möchte, hat nichts damit zu tun, dass die VM den Programmierer zum Speichermanagement entlastet. Ich, als Systemadministrator, habe möglicherweise den Heapspeicherbedarf meiner App falsch eingeschätzt und möchte ihn erhöhen, ohne die Anwendung neu zu starten. Es ist technisch machbar, den Heap-Space zu skalieren, da die JVM selbst das tut (von Minimum bis Maximum). – ithkuil

6

Soweit ich weiß, gibt es keine Möglichkeit, die Heap-Größe zur Laufzeit zu steuern.

Es kann jedoch nicht notwendig sein: Sie können eine minimale und maximale Heapgröße von mit den Schaltern -Xms und -Xmx bereitstellen. (zB -Xms128m -Xmx512m) Der jvm verwaltet die tatsächliche Größe des Heapspeichers innerhalb dieser Grenzen.

2

Das Maximum ist nicht die Größe des verwendeten Speichers, dies ist dynamisch basierend auf der Verwendung.

Die maximale Größe des Heapspeichers sollte der Punkt sein, an dem Sie das Programm lieber nicht ausführen würden, als mehr Speicher zu verwenden. Es macht wenig Sinn, dies auch akademisch dynamisch zu ändern.