2008-09-19 5 views
5

Wir haben ein Java-Programm, das eine große Menge an Heap-Speicherplatz benötigt - wir starten es (unter anderen Befehlszeilenargumente) das Argument -Xmx1500m, die einen maximalen Heap-Speicher von 1500 angibt MB. Wenn dieses Programm in einer Windows XP-Box gestartet wird, die neu gestartet wurde, wird es gestartet und ohne Probleme ausgeführt. Aber wenn das Programm mehrere Male ausgeführt wurde, hat der Computer für eine Weile gewesen, etc., wenn es versucht zu starten ich diesen Fehler:Tools zum Anzeigen/Lösen von Windows XP-Speicherfragmentierung

 
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 ich diesen Verdacht bestätigen soll. Zu diesem Zeitpunkt melden Task Manager und sysinternals procexp 2000 MB freien Speicher. Ich habe mir this question related to internal fragmentation

angeschaut So lautet die erste Frage: Wie bestätige ich meinen Verdacht? Die zweite Frage ist, wenn mein Verdacht richtig ist, kennt jemand irgendwelche Werkzeuge, um dieses Problem zu lösen? Ich habe mich ein wenig umgeschaut, aber ich habe nichts gefunden, was hilft, außer periodischen Neustarts der Maschine.

ps - Betriebssystemwechsel ist derzeit auch keine praktikable Option.

Antwort

2

Vereinbaren Sie mit Torlack, viel davon ist, weil andere DLLs geladen werden und an bestimmten Stellen gehen, die Menge an Speicher aufteilen, die Sie für die VM in einem großen Brocken bekommen können.

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

Ihre beste Wette, wenn Sie wirklich brauchen mehr als 1.2G Speicher für Ihre Java-App, ist auf 64-Bit-Windows oder Linux oder OSX zu sehen. Wenn Sie irgendeine Art von nativen Bibliotheken mit Ihrer App verwenden, müssen Sie sie für 64 Bit neu kompilieren, aber es wird viel einfacher sein, als zu versuchen, dls und Sachen neu zu betten, um den Speicher zu maximieren, den Sie auf 32 bit Windows bekommen können .

Eine andere Möglichkeit wäre, Ihr Programm in mehrere VMs zu teilen und sie über RMI oder Messaging oder etwas miteinander kommunizieren zu lassen. Auf diese Weise kann jede VM eine Teilmenge des von Ihnen benötigten Speichers haben. Ohne zu wissen, was Ihre App tut, bin ich mir nicht sicher, ob dies in irgendeiner Weise helfen wird, aber ...

0

Die Verwendung von Minimem (http://minimem.kerkia.net/) für diese Anwendung könnte Ihr Problem beheben. Ich bin mir jedoch nicht sicher, dass dies die Antwort ist, nach der Sie suchen. Ich hoffe, es hilft.

0

Vielleicht sollten Sie in Betracht ziehen, das Programm zu starten und den Speicher zu reservieren und nicht die VM nach jedem Lauf zu beenden. Suchen Sie nach verschiedenen GC-Optionen und geben Sie Ihre Objekte frei.

2

Wenn der Dateispeicherplatz nicht knapp wird, besteht dieses Problem nicht darin, dass auf dem Computer nicht genügend Arbeitsspeicher verfügbar ist. Der Sinn des virtuellen Speichers liegt darin, dass die Prozesse mehr virtuellen Speicher verwenden können, als physisch verfügbar ist.

Ohne zu wissen, wie die JVM den Heap behandelt, ist es ein bisschen schwierig, genau zu sagen, was das Problem ist, aber eines der häufigen Probleme ist, dass nicht genug zusammenhängender freier Adressraum in Ihrem Prozess verfügbar ist Heap erweitert werden. Warum dies ein Problem ist, nachdem die Maschine eine Weile ausgeführt wurde, ist ein wenig verwirrend.

Ich habe an einem ähnlichen Problem bei der Arbeit gearbeitet. Ich habe festgestellt, dass das Ausführen des Programms mit WinDBG und die Verwendung der Befehle "! Address" und "! Address -summary" von unschätzbarem Wert waren, um herauszufinden, warum der virtuelle Adressraum eines Prozesses fragmentiert wurde. Sie können auch versuchen, das Programm nach dem Neustart auszuführen und den Befehl "! Address" zu verwenden, um ein Bild des Adressraums aufzunehmen und dann dasselbe zu tun, wenn das Programm nicht mehr ausgeführt wird. Dies könnte Sie auf das Problem hinweisen. Vielleicht könnte etwas einfaches wie eine zusätzliche DLL laden das Problem verursachen.

2

Ich vermute, dass das Problem ist Windows-Speicherfragmentierung. Es gibt eine weitere Frage zu StackOverflow namens Java Maximum Memory on Windows XP, in der erwähnt wird, dass der Process Explorer verwendet wird, um zu sehen, wo DLLs im Speicher zugeordnet werden, und dann das Problem zu lösen, indem die DLLs neu erstellt werden, damit sie kompakter in den Speicher geladen werden.

0

Verwenden Sie vmmap von Microsoft SysInternals-Tools, um die Fragmentierung des virtuellen Adressraums anzuzeigen, und identifizieren Sie, was den Speicherplatz aufteilt

Verwandte Themen