如何在不设置 -Xmx 标志的情况下限制堆消耗

How to limit heap consumption without setting -Xmx flag

问题

我有一个包含大量公式的 .xlsx 文件。我想将此文件 t运行sform 为一个新的 .xlsx 文件,其中所有公式都替换为它的绝对值。为什么? 可能与这个问题无关。

我做了什么?

我的目标是在尽可能少的堆内存中执行此任务。所以我使用了 apache POI XSSF event API to read the source file and SXSSF API 的组合来编写输出文件。效果很好。

观察结果

所有测量均使用 JProfiler 10

当我 运行 我的代码转换一个大约 25K+ 行的文件(具有大约 25K * 23 个公式)时,它在峰值时使用了大约 250 MB 的堆 space。现在我 运行 与 -Xmx24M 相同的命令,并且代码在这个内存限制内被管理为 运行,这明显低于第一个 运行.

问题

垃圾收集器没有抽空在您的第一个 运行 中立即释放内存。处理 XLSX 文件最终会生成大量瞬态对象,因此第一个 运行 让它们在清理之前建立大约 250MB;而第二个,内存受限 运行,被迫更快地清理对象。

垃圾收集器有很多很多选项和策略可以配置。在我的脑海中,我知道的唯一限制特定代码消耗的方法是 运行 该代码仅在其自己的 JVM 进程中使用适当的 GC 参数。