301 Stimmen

Virtueller Speicherverbrauch von Java unter Linux, zu viel Speicher verwendet

Ich habe ein Problem mit einer Java-Anwendung, die unter Linux läuft.

Wenn ich die Anwendung mit der standardmäßigen maximalen Heap-Größe (64 MB) starte, sehe ich anhand der Tops-Anwendung, dass der Anwendung 240 MB virtueller Speicher zugewiesen sind. Dies führt zu einigen Problemen mit anderer Software auf dem Computer, die relativ ressourcenbeschränkt ist.

Der reservierte virtuelle Speicher wird sowieso nicht verwendet, soweit ich das verstehe, denn sobald wir das Heap-Limit erreichen, wird ein OutOfMemoryError geworfen wird. Ich habe dieselbe Anwendung unter Windows ausgeführt und sehe, dass die Größe des virtuellen Speichers und die Heap-Größe ähnlich sind.

Gibt es eine Möglichkeit, den verwendeten virtuellen Speicher für einen Java-Prozess unter Linux zu konfigurieren?

Bearbeiten 1 : Das Problem ist nicht der Heap. Das Problem ist, dass, wenn ich einen Heap von 128 MB, zum Beispiel, immer noch Linux 210 MB virtuellen Speicher zuweist, die nicht benötigt wird, ever.**

Bearbeiten 2 : Verwendung von ulimit -v ermöglicht die Begrenzung der Menge des virtuellen Speichers. Wenn die eingestellte Größe unter 204 MB liegt, kann die Anwendung nicht ausgeführt werden, obwohl sie nicht 204 MB, sondern nur 64 MB benötigt. Ich möchte also verstehen, warum Java so viel virtuellen Speicher benötigt. Kann dies geändert werden?

Bearbeiten 3 : Auf dem eingebetteten System laufen mehrere andere Anwendungen. Und das System hat eine Begrenzung des virtuellen Speichers (aus Kommentaren, wichtiges Detail).

4voto

VonC Punkte 1117238

Nur ein Gedanke, aber Sie können den Einfluss von a ulimit -v Option .

Dies ist keine wirkliche Lösung, da dadurch der verfügbare Adressraum für alle Prozess, aber das würde es Ihnen ermöglichen, das Verhalten Ihrer Anwendung mit einem begrenzten virtuellen Speicher zu überprüfen.

0voto

Marko Punkte 29192

Nein, Sie können die von der VM benötigte Speichermenge nicht konfigurieren. Beachten Sie jedoch, dass es sich hierbei um virtuellen Speicher handelt, der nicht resident ist und daher ohne Schaden bleibt, wenn er nicht tatsächlich genutzt wird.

Alternativ können Sie auch eine andere JVM als die von Sun ausprobieren, die einen geringeren Speicherbedarf hat, aber ich kann Ihnen hier keinen Rat geben.

0voto

Paul Tomblin Punkte 172816

Sun's java 1.4 hat die folgenden Argumente zur Kontrolle der Speichergröße:

-Xmsn Geben Sie die Anfangsgröße des Speicherzuweisungspools in Bytes an. Dieser Wert muss ein Vielfaches von 1024 sein. größer als 1MB sein. Fügen Sie den Buchstaben k oder K an, um Kilobytes anzugeben, oder m oder M um Megabytes anzugeben. Der Standard Wert ist 2MB. Beispiele:

           -Xms6291456
           -Xms6144k
           -Xms6m

-Xmxn Geben Sie die maximale Größe des Speicherzuweisungspools in Bytes an. Dieser Wert muss ein Vielfaches von 1024 größer als 2MB sein. Fügen Sie den Buchstaben k oder K an, um Kilobytes anzugeben, oder m oder M um Megabytes anzugeben. Der Standard Wert ist 64MB. Beispiele:

           -Xmx83886080
           -Xmx81920k
           -Xmx80m

http://java.sun.com/j2se/1.4.2/docs/tooldocs/Windows/java.html

Java 5 und 6 haben noch einige mehr. Siehe http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X