我有一个包含大量公式的.xlsx文件。我想将此文件转换为新的.xlsx文件,并将所有公式替换为其绝对值。为什么? 可能与此问题无关。
我的目标是在尽可能少的堆内存中执行此任务。所以我使用了apache POI XSSF event API的组合来读取源文件,并使用SXSSF API来编写输出文件。它运作良好。
使用JProfiler 10
进行所有测量当我运行我的代码来转换大约25K +行的文件(大约25K * 23公式)时,它在峰值处使用了大约250 MB的堆空间。现在我使用-Xmx24M
运行相同的命令,并且代码被设置为在此内存限制内运行,该限制明显低于第一次运行。
答案 0 :(得分:1)
垃圾收集器在第一次运行时没有立即释放内存。处理XLSX文件最终会产生大量瞬态对象,因此第一次运行可以让它们在清理之前建立大约250MB;而第二个内存受限的运行被迫更快地清理对象。
垃圾收集器有许多可以配置的选项和策略。在我的头脑中,我知道仅限于特定代码的消耗的唯一方法是仅使用适当的GC参数在其自己的JVM进程中运行该代码。