Prozess-Speicher-Vs-Heap — JVM
Haben wir eine web-Anwendung bereitgestellt, die auf einem tomcat server. Es gibt bestimmte geplante Aufträge, die wir ausführen, nach dem die heap-Speicher-peaks und zur Ruhe kommt, alles scheint in Ordnung.
Aber das system admin beschwert sich, dass die Speicherauslastung ("top" unter Linux ) wird immer größer je mehr die geplanten Arbeitsplätze sind.
Was ist die co-relation zwischen heap-Speicher und den Speicher der CPU? Kann es gesteuert werden JVM-Einstellungen? Ich verwendet JConsole das system überwachen.
Ich Zwang die garbage collection durch JConsole und die heap-Verwendung, kam nach unten, aber die Speicherauslastung auf Linux blieb hoch, und es niemals abgenommen.
Irgendwelche Ideen oder Anregungen würde sehr helfen?
- Der server ist anscheinend ein 64-bit-server.
- Wissen Sie, was die JVM server ausgeführt wird, und was war der Unterschied zwischen den heap-Speicher-Nutzung und die tatsächliche Speicherbelegung nach zwingen die garbage-collection?
- >>jedoch ist die Speicherauslastung unter Linux blieb hoch, und es niemals abgenommen. << Was ist die "Speicherauslastung"? Die GC in der Regel nicht zurückgegeben werden, den Arbeitsspeicher des Systems zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was wahrscheinlich eingehalten werden, ist die virtuelle Größe und nicht der resident set-Größe der Java-Prozess(es)? Wenn Sie ein Ziel haben, für eine kleine Stellfläche, möchten Sie vielleicht, um nicht gehören
-Xms
oder eine Mindest-Größe, die auf die JVM-heap-Argumente und stellen Sie die 70%-XX:MaxHeapFreeRatio=
auf eine kleinere Anzahl zu ermöglichen, aggressiver Haufen Schrumpfung.In der Zwischenzeit, liefern mehr Details als auf das, was beobachtet wurde, mit dem Kommentar, das Linux den Speicher nie abgenommen? Was ist Metrik?
-Xms
und-Xmx
Optionen? Auch die Berechnung der % der RES/VIRT-und % RES/SHR und Bericht zurück. Es kann hoch sein, aber der Prozess(die Prozesse) und haben eine gute portion geteilt.Den Speicher der JVM-Prozess ist nicht das gleiche wie die heap-Größe. Der verwendete heap-Größe nach unten gehen könnte, ohne eine tatsächliche Reduzierung des reservierten Speichers durch die JVM. Die JVM ist ein Auslöser, der angibt, soll es schrumpfen die heap-Größe. Wie @Xepoch erwähnt, dies wird gesteuert durch
-XX:MaxHeapFreeRatio
.Weil Sie sehr wahrscheinlich eine Art von memory-leak. System-admins neigen dazu, sich zu beschweren, wenn Sie sehen, Prozesse langsam kauen, bis mehr und mehr Raum.
Haben Sie schaute auf die Anzahl der threads? Ist Sie Anwendung erstellen eigener threads und senden Sie aus, um deadlock und warten untätig auf ewig?
Integrieren Sie mit Dritten APIs, die möglicherweise mit JNI?
Können Sie verwenden -Xmx und -Xms-Einstellungen um die Größe des Heaps. Mit tomcat können Sie eine Umgebungsvariable definieren, bevor Sie beginnen:
Diese zunächst erstellt einen heap von 256 MB mit einer max Größe von 512 MB.
Einige weitere details:
http://confluence.atlassian.com/display/CONF25/Fix+'Out+of+Memory'+errors+mit+steigenden+erhältlich+Speicher