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分析应用程序,我可以看到问题出在老一代
从这里开始(这是一个1.4.2页面,但所有Sun JVM中都应该存在相同的选项):
假设你正在使用CMS垃圾收集器(我相信服务器默认打开),你想要的选项是
-XX:CMSInitiatingOccupancyFraction=<percent>
Run Code Online (Sandbox Code Playgroud)
其中%是使用中将触发完整GC的内存百分比.
在此处插入标准免责声明,如果弄乱GC参数,可能会给您带来严重的性能问题,机器等因此而异.