当内存占用超过某个阈值时强制完全垃圾收集

Sil*_*ini 10 java garbage-collection jvm memory-management out-of-memory

我有一个服务器应用程序,在极少数情况下,可以分配大块内存.

这不是内存泄漏,因为垃圾收集器可以通过执行完整的垃圾收集来声明这些块.正常的垃圾收集释放了太小的内存量:在这种情况下它是不够的.

垃圾收集器在认为合适时执行这些完整的GC,即当应用程序的内存占用量接近使用-Xmx指定的分配的最大值时.

如果不是因为这些有问题的内存分配突然爆发,并且由于jvm无法足够快地执行GC以释放所需内存这一事实而导致OutOfMemoryErrors,那就没关系.如果我事先手动调用System.gc(),我可以防止这种情况.

无论如何,我不想自己监视我的jvm的内存分配(或者将内存管理插入到我的应用程序的逻辑中); 如果有一种方法可以运行具有内存阈值的虚拟机,那么将会自动执行完整的GC,以便尽快释放我将需要的内存.

长话短说:我需要一种方法(一个命令行选项?)配置jvm以便在内存占用达到一定阈值时提前释放大量内存(即执行完整的GC),我不在乎是否每隔一段时间,这会减慢我的应用程序.

我到目前为止所发现的只是改变世代大小的方法,但这不是我需要的(至少不是直接的).

我很感激你的建议,

西尔维奥

PS我正在努力避免大量分配,但它可能需要很长时间,同时我的应用程序需要一点稳定性

更新:用jvisualvm分析应用程序,我可以看到问题出在老一代

Sbo*_*odd 7

这里开始(这是一个1.4.2页面,但所有Sun JVM中都应该存在相同的选项):

假设你正在使用CMS垃圾收集器(我相信服务器默认打开),你想要的选项是

-XX:CMSInitiatingOccupancyFraction=<percent>
Run Code Online (Sandbox Code Playgroud)

其中%是使用中将触发完整GC的内存百分比.

在此处插入标准免责声明,如果弄乱GC参数,可能会给您带来严重的性能问题,机器等因此而异.