我们有一个遗留系统,可运行许多Jar文件。 每个jar文件都在一个单独的进程中运行。 其中一些jar文件的内存使用量激增。因此,它们的堆限制很高(~128MB),尽管在任何特定时刻大多数都不使用该内存。
问题是,Java没有释放内存的压力。由于垃圾收集器看不到大局,因此减小堆大小没有压力。因此,每个进程分配大约100MB的超额堆(大多数时候它们需要少于30MB)。
将此行为乘以许多java实例,并且您遇到了一个大问题。除了重新编写所有罐子以在单个JVM中工作之外,还有任何简单的解决方案吗?
答案 0 :(得分:0)
JVM有一些控制堆扩展/收缩的选项。对于HotSpot,这是
MaxHeapFreeRatio
:GC之后的最大堆空闲百分比,以避免收缩。
MinHeapFreeRatio
:GC之后的最小堆空闲百分比,以避免扩展。
如果已用内存和可用内存之间的比率超过MaxHeapFreeRatio,则JVM将缩小为-Xms
。如果该比率小于MinHeapFreeRatio,则JVM会扩展。