2011-01-07 8 views
12

Ich habe eine Anwendung, die für einige Prozesse vorübergehend eine bestimmte Menge an Speicher/Heap benötigt. Bei gegebenem vernünftigem Wert der maximalen Heap-Größe für die JVM als Option startet die JVM mit einem kleinen Heap und fordert bei Bedarf mehr Speicher vom Betriebssystem an.Gibt die JVM dem OS freien Speicher zurück, wenn es nicht mehr benötigt wird?

Meine Frage ist, ob dieser zusätzliche Speicher von der JVM an das Betriebssystem zurückgegeben wird (z. B. für andere Prozesse), wenn von meiner Anwendung nicht mehr viel Speicher benötigt wird. Momentan scheint meine Anwendung diese Erinnerung für immer zu halten, selbst wenn sie nicht mehr benötigt wird.

+0

Es gibt _no_ "die JVM", Sie sollten angeben, welche Implementierung Sie interessiert sind. – paxdiablo

+0

29 Fragen, nur eine einzige akzeptierte Antwort. Es sind Hausaufgaben zu erledigen. Ernst. –

Antwort

22

Die JVM gibt Speicher an das Betriebssystem zurück, aber nur sehr widerwillig, da sie es möglicherweise bald wieder benötigt, und das Abrufen von Speicher vom Betriebssystem ist eine relativ teure Operation.

Wenn Sie die JVM wollen eifrige Speicher an das Betriebssystem zurückzukehren, können Sie die tuning parameters of the Oracle JVM verwenden, speziell -XX:MaxHeapFreeRatio und -XX:MinHeapFreeRatio

3

Nicht unbedingt. Es hängt von der JVM ab, die Sie verwenden. Ich kenne einen Fall mit IBMs JVM. Wir hatten auch ein Problem mit einem Programm, das keinen Speicher freigab, auch wenn es nicht benötigt wurde. Einige Informationen finden Sie unter IBM's site.

0

Es ist auf der Version hängt ja und auf dem Müllsammler ausgewählt. Ich habe festgestellt, dass Java 1.8.0_73 gelegentlich kleine Beträge an das Betriebssystem zurückgibt. Dies ist die früheste Version, an die ich mich erinnern kann, ohne JVM-Parameter anpassen zu müssen, aber es kann sich sehr gut auf frühere Versionen beziehen, ich kenne keine exakte Version.

Wenn Parameter nicht angepasst werden, wird standardmäßig wahrscheinlich nichts freigegeben, es sei denn, 60-70% Ihres Heaps sind nicht belegt.

Hier könnte eine Leistungsüberlegung liegen - Java hatte den Ruf, langsam zu sein, so dass die JVM standardmäßig versuchen könnte, die Zuweisung vom Betriebssystem zu minimieren und die Speicherbereinigung so effizient wie möglich zu machen, indem sie viel Speicher und Daten speichert es weniger oft machen.

Ich frage mich, ob es mit Speicher weniger geizig sein könnte, wenn das OS relativ wenig freien Speicher übrig hat ..?

Verwandte Themen