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



问题

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

我做了什么?

我的目标是在尽可能低的堆内存中执行此任务。因此,我使用了Apache POI XSSF事件API的组合来读取源文件和SXSSF API来编写输出文件。效果很好。

观察

所有测量均使用Jprofiler 10

进行

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

问题

  • 如果我的代码已经可以在此低内存限制内运行,为什么在第一次运行中花了250MB RAM?
  • 即使未设置XMX,也可以限制该特定的代码以限制其内存消耗吗?

垃圾收集器在您的第一次运行中没有立即释放内存。处理XLSX文件最终将生成许多瞬态对象,因此,第一次运行使它们在清理之前构建到大约250MB。第二次,内存约束的运行被迫更快地清理对象。

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

相关内容

最新更新