2009-04-18 7 views
55

Gibt es eine Möglichkeit, die Größe des Heapspeichers aus einem laufenden Java-Programm festzulegen?Festlegen der JVM-Heap-Größe zur Laufzeit

+1

Als Referenz hier ist der RFE für Hotspot: bugs.sun.com/bugdatabase/view_bug.do?bug_id=4408373 –

Antwort

57

Nr

Was können Sie mit einer App zu tun, die sehr variable Heap Anforderungen hat, ist Ihre max Heap-Größe sehr hoch mit -Xmx und Melodie -XX:MaxHeapFreeRatio und -XX:MinHeapFreeRatio so einzustellen, dass die App nicht zu viel hängen des Speichers, wenn der Heap verkleinert wird (dies geschieht mit den Standardeinstellungen).

Beachten Sie jedoch, dass dies zu Leistungsproblemen führen kann, wenn der von der App tatsächlich verwendete Speicher stark und schnell schwankt. In diesem Fall ist es besser, den gesamten Speicher zu nutzen, anstatt ihn an das Betriebssystem zurückzugeben nur um es eine Sekunde später noch einmal zu behaupten. Vielleicht möchten Sie auch mit der GC options herumspielen, um sicherzustellen, dass der GC nicht zu viele nicht beanspruchte Objekte herumliegen lässt, die es zu tun pflegt, wenn viel Platz für den Haufen vorhanden ist und der das Ziel des Wunsches besiegen würde die Größe des Heapspeichers, um ihn an die Anforderungen der App anzupassen.

0

java -Xmx500m beim Start nur

11

Nach http://www.dreamincode.net/forums/showtopic96263.htm, können Sie dies nicht zur Laufzeit tun, aber Sie können einen anderen Prozess mit einem anderen Heap-Größe laichen.

+0

Auch bekannt als ein monumentaler Schmerz in der Rückseite. Wenn Sie viel Speicher verwenden, ist das Letzte, was Sie wollen, das alles zu veröffentlichen und dann in einem anderen Prozess neu zu laden. Natürlich können Sie den alten Prozess nicht lange genug offen halten, um Daten zu übertragen, da Sie mehr Speicher mit 2 Prozessen benötigen, nur um die Übertragung durchzuführen. Hoffentlich hast du richtig getippt, oder du machst es noch einmal. – Basic

8

Sie können diese Einstellungen beim Starten der Anwendung anpassen, aber sobald die JVM ausgeführt wird, können diese Werte nicht geändert werden. Etwas wie folgt aus:

java -Xms32m -Xmx512m FooBar

die minimale Heap-Größe zu 32 MB und die maximale Speichergröße auf 512 MB eingestellt. Sobald diese festgelegt sind, können Sie sie im laufenden Programm nicht mehr ändern.

-1

Wenn ich Ihre Frage richtig verstanden habe, versuchen Sie, die Heap-Größe bei Laufzeit zu ändern. Ich sehe keinen Grund, warum das möglich sein sollte. Legen Sie die Größe des Heapspeichers unter startup mit der -Xmx JVM-Option fest. Ich rate Ihnen auch, die Option -Xms nur zu setzen, wenn Sie unbedingt müssen. Diese Option legt die anfängliche Menge an Kopfspeicher fest, der für die JVM reserviert ist.

Sie sollten wissen, wie sich Ihre Anwendung in Bezug auf Speicher verhält. Stellen Sie den Wert -Xmx mit Bedacht ein. Wenn es sich bei Ihrer App um eine Art Server-App handelt, können Sie einen höheren Wert festlegen. Anderenfalls können Sie Ihre Auswahl mit anderen möglichen Anwendungen, die auf Client-Computern ausgeführt werden, und natürlich mit dem verfügbaren Speicher kompromittieren.

+1

Setzen Sie den Wert mit Bedacht ... Ja, das ist ein guter Rat. Aber bedenken Sie diesen Fall - Sie sehen, wie Sie die Anwendung so weit wie möglich auf das Maximum bringen, und Sie können nichts damit anfangen. Ja, es gibt ein Leck im Code ... aber zuerst müssen wir während des Tages am Leben bleiben und dann werden wir das Problem beheben –

+0

Beachten Sie auch, dass dies ein Applet oder eine andere Art von App sein kann, wo Sie den VM-Start nicht kontrollieren die Einstellungen. Das sind Fälle, in denen das nett wäre. Das Hauptproblem, denke ich, ist, dass Sie sicherheitsrelevante Speicherprobleme haben könnten, wenn Sie dies ändern könnten. –

2

Der Konsens kann in der Tat sein, dass dies nicht möglich ist, aber wir sollten die JVM Quelle betrachten, um zu sehen, wie es ergonomisch kontrolliert werden kann. Es wäre sehr schön, wenn ein JVMTI-Agent in der Lage wäre, die Heap/Perm/Tenured/New/& Größe online/zur Laufzeit anzupassen.

Was würde das tun? Es würde Agenten erlauben, Größenanpassungen basierend auf Performance- oder Footprint-Zielen abzuleiten, was beim Verschieben von JVMs in die Cloud wichtig ist.

+3

Dies liest sich eher wie eine JVM-Feature-Anforderung als eine Antwort. . . – ruakh

0

Ich habe dieselbe Frage an mich gestellt. Und im Gegensatz zu den obigen Antworten gibt es etwas, was ich tun kann über meine App Erhöhung Max Heap JVM Größe. Wenn es sich bei der App um einen Webserver im Cluster-Modus handelt, könnte ich eine neue Instanz mit geänderter Min/Max-Heap-Größe starten und dann die ursprüngliche Instanz herunterfahren.Dies ist besonders einfach in GlassFish, wo die Verwaltungsinstanz von der JVM von nodeAgent (App Server Cluster-Instanz) getrennt ist.

Da viele JVM-Anwendungen Web-Apps sind, halte ich es für sinnvoll, in diesem Blog zu erhalten.

2

können Sie verwenden, um die -mx Option beim Start (auch als -Xmx bekannt) Diese maximale Größe, die Sie jemals in denen Sie benötigen, sollte dazu führen, sollten Sie es nicht mehr als die maximale Größe festlegen müssen Sie wird jemals brauchen.

Allerdings ist eine Umgehung der Haupt() überprüfen Sie die maximale Größe und starten Sie das Java neu, wenn die maximale Größe nicht wie gewünscht ist. d. h., starte ein anderes Java-Programm und stirb.

+0

Dies setzt voraus, dass Sie im Voraus wissen, wie viel Speicher Sie benötigen. Das ist gut für Webserver/andere Dinge, die streamen, aber wenn Sie Daten analysieren (zB einen Index erstellen/Trends suchen), müssen Sie im Voraus wissen, was Ihre Daten sein werden, was ziemlich einschränkend ist. – Basic

+0

@Basic Sie nicht Sie müssen wissen, wie viel Speicher Sie benötigen. Das -Xmx ist das Maximum, das die JVM haben kann, d.h. das Programm sollte mit einem OutOfMemoryError abstürzen, anstatt mehr Speicher zu verwenden. Dieses Maximum hängt normalerweise davon ab, wie viel Speicher Sie haben und der Standardwert ist 1/4 des Hauptspeichers. Die JVM wird nicht viel Speicher für ein "Hallo Welt" -Programm verwenden, unabhängig davon, wofür Sie das Maximum festlegen. –

+1

Angenommen, Sie haben einen Prozess und geben ihm 50 Gigabyte Speicher im Voraus und während der laufenden Ankündigung läuft viel GC und wahrscheinlich wären 56 GiB besser und Sie können das Programm nicht einfach neu starten, ohne viel Neuberechnung durchzuführen. – kap