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

问题

我有一个包含许多公式的.xlsx文件。 我想把这个文件转换成一个新的.xlsx文件,所有的公式都用其绝对值replace。 为什么? 可能与这个问题没有关系。

我做了什么?

我的目标是在尽可能less的堆内存中执行此任务。 所以我使用了apache POI XSSF event API的组合来读取源文件和SXSSF API来写输出文件。 它运作良好。

意见

所有测量都使用JProfiler 10进行

当我运行我的代码来转换大约25K +行的文件(大约25K * 23的公式)时,它在峰值处使用大约250 MB的堆空间。 现在我用-Xmx24M运行相同的命令,代码被设置为在这个内存限制内运行,这个限制比第一次运行要低得多。

问题

  • 如果我的代码已经可以在这个低内存限制下运行,为什么在第一次运行中需要250MB的内存呢?
  • 是否可以限制这个特定的代码来限制它的内存消耗在一个下限内,即使Xmx没有被设置?

垃圾收集器在第一次运行时没有立即释放内存。 处理XLSX文件最终会产生大量的瞬态对象,所以第一次运行可以让它们在清理之前build立大约250MB的空间。 而第二个内存受限的运行则被迫尽早清理对象。

垃圾收集器有许多可以configuration的选项和策略。 除了我自己的头脑之外,我知道限制消费仅限于特定代码的唯一方法是仅在其自己的JVM进程中使用适当的GC参数运行该代码。