How to resolve java.lang.OutOfMemoryError: Java heap space without increasing the heap memory size
How to resolve java.lang.OutOfMemoryError: Java heap space without increasing the heap memory size
我知道 java.lang.OutOfMemoryError: Java heap space
上有很多问题。
喜欢question 1
但是 none 个链接不是我问题的正确答案。
我们正在生成电子表格格式的报告,其中大量数据来自数据库端。我们将堆内存大小从 2 GB 增加到 4 GB,但没有用。
可能是因为数据库列多了一些space,所以我用trim()
的方法把getters
和setters
都删掉了,这个也没用。
例如:
String s = "Hai ";
s.trim();
如果有人知道如何从 Java 编码方面解决这个问题,而不增加堆的大小 space。因为客户告诉他们,他们不会再增加堆space。
调用此方法时出现异常
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()));}
由于机密,无法共享更多代码。通过查看上面的代码,如果你们有任何替代解决方案,请通知我。我们正在合并两个基于相同 id
的 String
。
We are generating reports in spreadsheet format, where huge data is
coming from database side.
在这种用例中,您至少有两件事需要研究,它们可能会改善消耗的内存,但首先您必须确定罪魁祸首。
监控工具在此用例中确定的主要原因通常是:
1) 如果从数据库加载的数据被识别为内存消耗大户,您可能不应该一次性加载所有数据。
将所有这些对象保存在内存中,同时根据这些数据创建电子表格可能会消耗大量内存。
总体而言,如果应用程序并行用于其他用例。
您应该将检索分成几个检索。
然后调用一个来检索一些对象,填充电子表格并释放不再需要的这些对象。等等...
2) 在电子表格创建过程中,如果使用库创建的对象电子表格被识别为内存消耗大户,您应该倾向于使用流 API 或事件 API 来写入电子表格API 将整个电子表格加载到内存中。
例如 POI 提供了一个类似于 DOM 的 API : XSSF
和一个流媒体 API : SXSSF
.
您没有指定用于创建电子表格的库,但这并不重要,因为使用的逻辑对任何人都应该相同。
我知道 java.lang.OutOfMemoryError: Java heap space
上有很多问题。
喜欢question 1
但是 none 个链接不是我问题的正确答案。
我们正在生成电子表格格式的报告,其中大量数据来自数据库端。我们将堆内存大小从 2 GB 增加到 4 GB,但没有用。
可能是因为数据库列多了一些space,所以我用trim()
的方法把getters
和setters
都删掉了,这个也没用。
例如:
String s = "Hai ";
s.trim();
如果有人知道如何从 Java 编码方面解决这个问题,而不增加堆的大小 space。因为客户告诉他们,他们不会再增加堆space。
调用此方法时出现异常
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()));}
由于机密,无法共享更多代码。通过查看上面的代码,如果你们有任何替代解决方案,请通知我。我们正在合并两个基于相同 id
的 String
。
We are generating reports in spreadsheet format, where huge data is coming from database side.
在这种用例中,您至少有两件事需要研究,它们可能会改善消耗的内存,但首先您必须确定罪魁祸首。
监控工具在此用例中确定的主要原因通常是:
1) 如果从数据库加载的数据被识别为内存消耗大户,您可能不应该一次性加载所有数据。
将所有这些对象保存在内存中,同时根据这些数据创建电子表格可能会消耗大量内存。
总体而言,如果应用程序并行用于其他用例。
您应该将检索分成几个检索。
然后调用一个来检索一些对象,填充电子表格并释放不再需要的这些对象。等等...
2) 在电子表格创建过程中,如果使用库创建的对象电子表格被识别为内存消耗大户,您应该倾向于使用流 API 或事件 API 来写入电子表格API 将整个电子表格加载到内存中。
例如 POI 提供了一个类似于 DOM 的 API : XSSF
和一个流媒体 API : SXSSF
.
您没有指定用于创建电子表格的库,但这并不重要,因为使用的逻辑对任何人都应该相同。