如何解决java.lang.OutOfMemoryError:java堆空间而不增加堆内存大小

如何解决java.lang.OutOfMemoryError:java堆空间而不增加堆内存大小,java,jvm,out-of-memory,heap-memory,Java,Jvm,Out Of Memory,Heap Memory,我知道在java.lang.OutOfMemoryError:java堆空间上有很多问题 像 但是没有一个链接不是我问题的正确答案 我们正在生成电子表格格式的报告,其中巨大的数据来自数据库端。我们将堆内存大小从2GB增加到4GB,没有任何用处 可能是因为数据库列中有一些额外的空间,所以我使用trim()方法修剪了所有getter和setter,这也没有用 例如: String s = "Hai "; s.trim(); 如果有人知道如何从Java编码方面解决这个问题,而不增加堆空间

我知道在
java.lang.OutOfMemoryError:java堆空间
上有很多问题

但是没有一个链接不是我问题的正确答案

我们正在生成电子表格格式的报告,其中巨大的数据来自数据库端。我们将堆内存大小从2GB增加到4GB,没有任何用处

可能是因为数据库列中有一些额外的空间,所以我使用
trim()
方法修剪了所有
getter
setter
,这也没有用

例如:

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()));}
由于机密,无法共享更多代码。通过查看以上代码,如果你们有任何替代解决方案,请通知我。我们正在基于相同的
id
合并两个
String

我们正在生成电子表格格式的报告,其中包含大量数据 来自数据库端

在这种用例中,您至少有两件事情需要研究,这可能会提高消耗的内存,但首先您必须确定罪魁祸首

本用例中监控工具识别的主要原因通常是:

1) 如果从数据库加载的数据被确定为内存的大消耗者,则可能不应该一次加载所有数据。
将所有这些对象保留在内存中,同时根据这些数据创建电子表格可能会消耗大量内存
如果应用程序并行地用于其他用例,则为总体。 您应该将检索分为几个检索。
然后调用one来检索一些对象,填充spreadsheat并释放不再需要的这些对象。等等

2) 在电子表格创建过程中,如果使用库创建的对象电子表格被确定为内存的大消耗者,则您应该支持流式API或事件API,以便在将整个电子表格加载到内存中的API之上编写电子表格。
例如,POI提供了一个类似DOM的API:
XSSF
和一个流式API:
SXSSF


您没有指定创建电子表格时使用的库,但这并不重要,因为使用的逻辑对于任何人都应该是相同的。

您可以提供更多的代码吗?尝试成批提供数据。我想要遇到这个问题,您必须一次性将所有数据从数据库发送到您的应用程序服务器。@notanormie我已经用示例代码编辑了这个问题。@alexd是的,我们通过调用store,一次性获取所有数据_proc@ArvindKatte,您的系统配置是什么?你是如何使用java堆的呢?我同意第一点。但是现在代码转移到了生产级别,现在我们无法正确更改数据结构。@ArvindKatte,好吧,如果您不更改任何内容,任何内容都不会得到修复。今天我们与客户进行了通话,让我们看看他们将放弃什么方法。您的第一种方法确实帮助了我,我正在创建一个临时变量,然后将值写入工作表,然后清除临时变量内存。客户同意这种方法。