我们在wildfly 8.2中部署了一个企业应用程序,其中包含min&最大堆设置为1.5 GB。其中一个操作导致将太多对象加载到堆中。尽管在操作之后对象被取消引用,但jvm堆的使用率却没有降低。
但是,如果我在外部手动触发GC(使用jcmd),我看到堆使用量大幅下降。为什么普通GC没有像GC.run那样减少内存?
JVM设置
-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
答案 0 :(得分:2)
从外部触发的是Major / Full GC,除非绝对必要,否则不会自动触发。为了避免臭名昭着的GC暂停,JVM会尽可能地利用Old Generation中的垃圾来谋生。