Frage

Wir haben ein Java-Programm, das eine große Menge an Heap-Speicher erfordert - wir hat es mit (unter anderen Befehlszeilenargumenten) starten Sie das Argument -Xmx1500m, die einen maximalen Heap-Speicher von 1500 MB angibt. Wenn Sie dieses Programm starten auf einem Windows XP-Box, die frisch neu gestartet wurde, wird es starten und laufen ohne Probleme. Aber wenn das Programm mehrere Male ausgeführt wurde, hat der Computer für eine Weile gewesen, etc., wenn es versucht, beginne ich diesen Fehler:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Ich vermute, dass Windows selbst aus dem Speicher Fragmentierung leidet, aber ich weiß nicht, wie dieser Verdacht zu bestätigen. Zu der Zeit, dies geschieht, den Task-Manager und sysinternals procexp Bericht 2000 MB freien Speicher. Ich habe unter diese Frage auf interne Fragmentierung im Zusammenhang

Die erste Frage ist, Wie bestätige ich meinen Verdacht? Die zweite Frage ist, ob mein Verdacht richtig ist, weiß jemand von Werkzeugen, dieses Problem zu lösen? Ich habe um ziemlich viel sieht, aber ich habe nichts gefunden, das, anders als periodischer Neustarts der Maschine hilft.

ps - ändernden Betriebssysteme ist auch nicht gerade ein gangbarer Weg.

War es hilfreich?

Lösung

Vereinbaren Sie mit Torlack, ist eine Menge, weil andere DLLs geladen und in bestimmte Punkte gehen immer, wie viel Speicher Zerschlagung Sie für die VM in einem großen Teil erhalten.

Sie können einige Arbeit auf WinXP tun, wenn Sie mehr als 3G-Speicher einen Teil der Fenster Zeug zu bekommen bewegt sich um, PAE hier sehen: http://www.microsoft.com/whdc/system/ Plattform / server / PAE / PAEdrv.mspx

Ihre beste Wette, wenn Sie wirklich mehr als 1.2G Speicher für Ihre Java-Anwendung benötigen, ist auf 64-Bit-Windows oder Linux oder OSX zu suchen. Wenn Sie jede Art von nativen Bibliotheken mit Ihrer App verwenden musst du sie für 64-Bit neu zu kompilieren, aber sein wird viel leichter sein, als zu versuchen, DLLs und Sachen rebase die Speicher zu maximieren Sie auf 32-Bit-Windows bekommen .

Eine andere Möglichkeit wäre Ihr Programm gliedert sich in mehrere VMs und haben sie mit einander über RMI oder Messaging oder etwas kommunizieren. Auf diese Weise jede VM kann eine Teilmenge des Speichers, die Sie brauchen. Ohne zu wissen, was Ihre Anwendung tut, sie ist nicht sicher, dass dies in irgendeiner Weise zu helfen, aber ...

Andere Tipps

Wenn Sie nicht aus der Auslagerungsdatei ausgeführt wird, ist dieses Problem nicht, dass der Computer nicht genügend Arbeitsspeicher ausgeführt wird. Der springende Punkt des virtuellen Speichers ist die Prozesse zu ermöglichen, mehr virtuelle Speicher zu verwenden, als physisch verfügbar ist.

Nicht zu wissen, wie die JVM den Heap behandelt, ist es ein bisschen schwer, genau zu sagen, was das Problem ist, aber eine der häufigsten Probleme ist, dass es nicht genügend zusammenhängenden freien Adressraum in Ihrem Prozess verfügbar ist, den Haufen zu ermöglichen erweitert werden. Warum dies ein Problem sein würde, nachdem die Maschine ist schon eine Weile läuft ein wenig verwirrend ist.

Ich habe auf ein ähnliches Problem bei der Arbeit gearbeitet. Ich habe festgestellt, dass das Programm läuft WinDBG verwenden und mit der „!-Adresse“ und „! Adresse -summary“ Befehle haben bei der Verfolgung, warum ein Verfahrens virtueller Adressraum fragmentiert worden von unschätzbarem Wert. Sie können auch versuchen, das Programm nach dem Neustart ausgeführt wird und mit dem „! Adresse“ Befehl ein Bild von dem Adressraum zu nehmen und dann das Gleiche tun, wenn das Programm nicht mehr läuft. Dies könnte Sie in Hinweis auf das Problem. Vielleicht etwas einfacher als zusätzlicher DLL bekommt Laden möglicherweise das Problem verursachen.

Ich vermute, dass das Problem ist, Windows-Speicherfragmentierung. Es ist eine andere Frage hier auf Stackoverflow genannt Java Maximaler Speicher unter Windows XP , die erwähnt Process Explorer verwenden zu sehen, wo DLLs in dem Speicher abgebildet werden, und dann das Problem zu lösen, indem sie die DLLs Rebasing, so dass die Last in dem Speicher in einer kompakteren Weise.

Mit Minimem ( http://minimem.kerkia.net/ ) für diese Anwendung könnte fixieren Sie Ihre Problem. Allerdings bin ich nicht sicher, das ist die Antwort, die Sie suchen. Ich hoffe, es hilft.

Vielleicht sollten Sie erwägen, um das Programm zu starten und den Speicher zu reservieren und nicht endet die VM nach jedem Lauf. Geben Sie für verschiedene GC-Optionen und lassen Sie Ihre Objekte.

Verwenden Sie VMMap von Microsofts Sysinternals-Tools, die Fragmentierung des virtuellen Adressraum zu sehen und erkennen, was den Raum bricht nach oben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top