1

我们有一个运行许多 Jar 文件的遗留系统。每个 jar 文件都在单独的进程中运行。其中一些 jar 文件的内存使用量会激增。因此,它们的堆限制很高(~128MB),尽管在任何给定时刻,它们中的大多数都不使用该内存。

问题是,Java 没有释放内存的压力。由于垃圾收集器看不到大局,因此没有减少堆大小的压力。因此,每个进程分配了大约 100MB 的多余堆(大多数情况下它们需要不到 30MB)。

将此行为与许多 java 实例相乘,您就会遇到一个大问题。除了重写所有 jar 以在单个 JVM 中工作之外,是否有任何简单的解决方案?

4

1 回答 1

1

JVM 有一些选项来控制堆扩展/收缩。对于热点,这是

MaxHeapFreeRatio: GC 后最大可用堆百分比以避免收缩。 MinHeapFreeRatio: GC 后堆空闲的最小百分比以避免扩展。

如果已用内存和空闲内存的比例超过 MaxHeapFreeRatio,JVM 会收缩到-Xms. 如果该比率小于 MinHeapFreeRatio,则 JVM 会扩展。

于 2013-07-01T09:46:57.067 回答