我的tomcat Java 8 应用程序在 32GB 具有 G1 GC 的虚拟机上以 24GB XMX 运行。它处理大文件。文件的大小为 5-7 GB 。
在处理此类文件之一期间进行部署后,VM开始使用分配的内存的> 90%。此值不会降低,只会增加,尽管处理已结束并且Java有大量未使用的堆(〜7GBs )。
但是,一旦我们从VisualVM触发 Full GC ,它就会掉线。 我们还注意到该应用程序在其生命周期中只有一个主要GC,这是由VisualVM的Full GC触发的。
很明显,java已经提交了堆并且不想将其返回给操作系统。
问题是:如何摆脱这种行为并将内存返回给OS(看起来G1直到Java 12才开始这样做)或如何调查为什么剩余8 GB的非堆空间是否已满?似乎我无法使用VisualVM做到这一点。