我知道java.lang.OutOfMemoryError: Java heap space
上有很多问题。
但是没有一个链接不是我问题的正确答案。
我们正在以电子表格格式生成报告,其中大量数据来自数据库端。我们将堆内存大小从2 GB增加到4 GB,没有用。
可能是因为数据库列中有一些额外的空间,所以我使用getters
方法修剪了所有setters
和trim()
,这也没用。
例如:
String s = "Hai ";
s.trim();
如果任何人有如何从Java编码方面解决此问题,而不增加堆空间的大小。因为客户说,他们不会再增加堆空间。
调用此方法获取异常时
private CrossTabResult mergeAllListsSameNdc(CrossTabResult crt, CrossTabResult res) {
crt.setFormularyTier(crt.getFormularyTier()==null ? "":((crt.getFormularyTier().contains(crt.getListId())? crt.getFormularyTier(): crt.getListId()+crt.getFormularyTier()) +"~"+res.getListId()+res.getFormularyTier()));
crt.setFormularyTierDesc(crt.getFormularyTierDesc()==null ? "":((crt.getFormularyTierDesc().contains(crt.getListId())? crt.getFormularyTierDesc(): crt.getListId()+crt.getFormularyTierDesc()) +"~"+res.getListId()+res.getFormularyTierDesc()));}
由于保密,无法共享更多代码。通过查看上面的代码,如果您有人有任何替代解决方案,请通知我。我们基于相同的String
合并了两个id
。
答案 0 :(得分:2)
我们正在以电子表格格式生成报告,其中包含大量数据 来自数据库方面。
在这种用例中,你至少要研究两件可以改善消耗记忆的东西,但首先要确定罪魁祸首。
本用例中监控工具确定的主要原因一般是:
1)如果从DB加载的数据被识别为内存的大消费者,您可能不应一次性加载所有数据。
将所有这些对象保存在内存中并同时从这些数据创建电子表格可能会消耗大量内存。
总的来说,如果应用程序并行用于其他用例。
您应该将检索分成几个检索
然后调用一个来检索一些对象,填充spreadheat并释放这些不再需要的对象。等等...
2)在电子表格创建过程中,如果使用库创建的对象电子表格被识别为内存的大消费者,则应该支持流API或事件API通过API编写电子表格,将整个电子表格加载到内存中。登记/>
例如,POI提供类似DOM的API:XSSF
和流API:SXSSF
您没有指定用于创建电子表格的库用途,但这并不重要,因为使用的逻辑对任何人都应该相同。