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

时间:2017-06-27 06:07:30

标签: java excel heap-memory xssf sxssf

问题

我有一个包含大量公式的.xlsx文件。我想将此文件转换为新的.xlsx文件,并将所有公式替换为其绝对值。为什么? 可能与此问题无关。

我做了什么?

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

观察

使用JProfiler 10

进行所有测量

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

问题

  • 如果我的代码已经设法在这个低内存限制内运行,为什么第一次运行需要250MB +内存?
  • 是否可以限制此特定代码段以将内存消耗限制在低限制内,即使未设置Xmx?

1 个答案:

答案 0 :(得分:1)

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

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