如何解决如何改进代码以避免GC开销限制错误?
我收到此错误消息: java.lang.OutOfMemoryError:超出了GC开销限制
在此代码的catch块:
try (BufferedReader br = new BufferedReader(new FileReader(fileName)))
{
System.out.println("Starting try block");
String line;
Row row;
Cell cell;
int rowIndex = 0;
while ((line = br.readLine()) != null)
{
row = sheet.createRow(rowIndex);
String[] tokens = line.split("[|]");
for(int iToken = 0; iToken < tokens.length; iToken++)
{
cell = row.createCell(iToken);
cell.setCellValue(tokens[iToken]);
}
rowIndex++;
}
}
catch(Throwable e)
{
e.printStackTrace();
}
我正在读取的文件是大型txt文件(〜90000KB)。 在运行时将VM内存增加到2048K之后,我停止出现HeapSize错误,但开始出现GC错误。 如何修改代码以避免GC错误?
解决方法
我猜测Sheet
,Row
和Cell
是某些Java电子表格API中的类。
这是个坏消息。
问题在于您的代码正在构建一个大型数据结构,该结构表示内存中的电子表格,然后将其写入文件。显然,数据结构大于JVM堆可以容纳的数据结构。
第二个问题是,如果继续以这种方式使用上述API ,则将无法降低内存利用率。
有几种解决方法:
-
增加堆的大小,并不断增加直到没有OOMEs。如果那意味着您需要一台具有更多RAM的计算机来运行您的应用程序,请购买一台。
-
如果您使用的API具有用于写入数据的 streaming 模式,请使用该模式。或寻找此API的另一种支持流传输的API。
-
也许有一个非流式电子表格API,它使用的内存少于当前使用的内存。 (请参阅@Holger的评论。)
-
不生成电子表格。电子表格(IMO)是一种表示数据的低效方式。而是将数据输出为CSV文件,JSON文件,XML文件或其他任何易于流式传输的格式。
-
如果“业务类型”坚持使用电子表格,则可以将数据输出为CSV文件,然后使用外部工具从CSV文件创建电子表格。
here描述了POI的流版本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。