2016-10-04 2 views
0

Wir haben eine Enterprise-Anwendung in Wildfly 8.2 bereitgestellt mit min & max Heap auf 1,5 GB festgelegt. Eine der Aktionen bewirkt, dass zu viele Objekte in den Heap geladen werden. Obwohl das Objekt nach der Aktion dereferenziert wird, wird die Verwendung des jvm-Heapspeichers nicht heruntergefahren.Jboss GC gibt keinen Speicher frei

Aber, wenn ich manuell GC extern auslösen (mit jcmd), sehe ich einen großen Rückgang in der Heap-Nutzung. Warum reduziert normaler GC den Speicher nicht so sehr wie GC.run?

JVM-Einstellungen

-Xms1536m -Xmx1536m -XX: MaxMetaspaceSize = 512m -XX: ReservedCodeCacheSize = 128M -Server -XX: + HeapDumpOnOutOfMemoryError -XX: HeapDumpPath =/tmp -verbose: gc -XX : + PrintGCTimeStamps -XX: + PrintGCDetails -Djsse.enableSNIExtension = false -Dsun.rmi.dgc.client.gcInterval = 600000 -Dsun.rmi.dgc.server.gcInterval = 600000

Antwort

2

Was man von außen auslösen ist Major/Full GC, die nicht automatisch ausgelöst wird, es sei denn, dies ist absolut notwendig. Die JVM versucht so lange wie möglich mit Müll in der Alten Generation zu leben, um die berüchtigte GC-Pause zu vermeiden.

+1

Beachten Sie, dass das OP reduziert, wie oft ein vollständiger GC vom GDC ausgelöst wird, was indirekt zu diesem Verhalten beiträgt. +1 –

+0

Gut bekannt ... aber gilt es auch für EJB? Sie sollten nach einer Anfrage gepoolt und "aufgeräumt" werden. Ich dachte, DGC wäre eher ein Problem mit der RMI-Nutzung. –

+1

gdc ist für rmi aber es stellt sicher, dass volle GCs regelmäßig auftreten, egal was Sie tun. –

Verwandte Themen