Java 使用Apache POI HSSF时内存泄漏?

Java 使用Apache POI HSSF时内存泄漏?,java,apache,apache-poi,hssf,Java,Apache,Apache Poi,Hssf,我已经仔细研究了一下,但找不到一个明确的答案:使用Apachie POI HSSF创建的对象是由普通Java gc回收的,还是我需要做其他事情 我有一个Java程序,可以读取测试数据文件并编写数据分析的xls文件。我注意到,每个处理的文件的工作集大小(如Process Explorer所报告的)都会变大大约3MB,这让我怀疑(尽管显式调用了gc),POI对象(单元格、行、表)不会被回收,即使每个文件写入后都没有指向它们的指针 我没有预料到这一点,所以代码现在每次需要时都会创建新的对象(单元格等)

我已经仔细研究了一下,但找不到一个明确的答案:使用Apachie POI HSSF创建的对象是由普通Java gc回收的,还是我需要做其他事情

我有一个Java程序,可以读取测试数据文件并编写数据分析的xls文件。我注意到,每个处理的文件的工作集大小(如Process Explorer所报告的)都会变大大约3MB,这让我怀疑(尽管显式调用了gc),POI对象(单元格、行、表)不会被回收,即使每个文件写入后都没有指向它们的指针

我没有预料到这一点,所以代码现在每次需要时都会创建新的对象(单元格等)。我看到的一个建议是,创建所需的图纸、行和单元格一次,然后在写出每个xls文件之前在其中设置新值。这实际上会减少内存的使用吗?或者在单元格中设置新值也会消耗内存吗

如果有关系,我使用的是poi-3.9-20121203

我遇到了一个问题,因为我现在有几千个文件要处理,最后出现了内存不足的错误。(由于各种原因,如果我能一次完成所有任务,而不是一次完成500个任务,那就容易多了。)


非常感谢您的建议和/或建议。

一个建议是,在Apache POI中,某些资源(如CellStyle和Font)需要重新使用,否则每次都会向单元格附加一个新对象(不知道是否已经创建了给定的样式)。请您发布您的代码,并描述更多的输入(大小、行数等),以避免猜测可能出现了什么问题?您确定完成后删除了对该文件的所有引用吗?列表或地图中没有延迟条目?没有溪流开放吗?没有传递到其他可能缓存东西的库的引用?诺伯特:谢谢你的建议。代码非常大(而且很难看),所以发布可能没有帮助。回复:单张尺寸——相当适中:三张,两张w/200行,每行5匹,一张2000行,每行3匹。因此,ss大小可能不是问题所在。您能否指出需要重复使用CellStyle和字体的声明来源,以便我可以查看该类别中的其他内容,并可以相应地重复使用?如前所述,如果我知道必须以这种方式处理哪些对象,我准备重复使用而不是生成新对象。