如何在不设置-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参数运行该代码。
- 在每个单元上执行VLOOKUP之后,单元格的SUM范围
- 使用ExcelDataReader v2.1从C#中的XLSX读取数据并写入SQL Server
- 如何在Excel中创build敏捷燃尽图表
- OleDbConnection.GetOleDbSchemaTable for .xlsx不识别隐藏的工作表
- 插入错误:java.sql.SQLException:ORA-00911:无效的字符
- VBA多个Word表格到Excel – 文档中没有表格
- 如果B(i)为TRUE且B(i-1)为FALSE,如何findExcel列A的平均值?
- Python xlsx单元保护(locking)
- VBA Code-Flow通过数据范围循环