【问题标题】:How to resolve java.lang.OutOfMemoryError: Java heap space without increasing the heap memory size如何解决 java.lang.OutOfMemoryError: Java 堆空间而不增加堆内存大小
【发布时间】:2017-08-18 19:12:13
【问题描述】:

我知道java.lang.OutOfMemoryError: Java heap space 有很多问题。

点赞question 1

但没有一个链接不能正确回答我的问题。

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

可能是因为数据库列有多余的空间,所以我用trim()方法修剪了所有getterssetters,这也没用。

例如:

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

【问题讨论】:

  • 您能提供更多代码吗?
  • 尝试批量带入数据。我想要遇到这个问题,您必须一次性将所有数据从数据库获取到您的应用程序服务器。
  • @notanormie 我用示例代码编辑了问题。
  • @alexd 是的,我们通过调用 store_proc 一次性获取所有数据
  • @ArvindKatte ,你的系统配置是什么?以及你使用 java 堆的内存是多少?

标签: java jvm out-of-memory heap-memory


【解决方案1】:

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

在这种用例中,您至少要研究两件事可能会改善消耗的内存,但首先您必须找出罪魁祸首。

本用例中监控工具识别的主要原因一般有:

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

2) 在电子表格创建期间,如果使用库创建的对象电子表格被识别为占用大量内存,您应该倾向于使用流 API 或事件 API 来编写电子表格,而不是在内存中加载整个电子表格的 API。 例如 POI 提供了一个类似 DOM 的 API:XSSF 和一个流式 API:SXSSF
您无需指定用于创建电子表格的库,但这并不重要,因为任何人都应使用相同的逻辑。

【讨论】:

  • 我同意第一点。但是现在代码移到了生产级别,现在我们无法正确更改数据结构。
  • @ArvindKatte,好吧,如果你不改变任何东西,什么都不会得到解决。
  • 今天跟客户打了个电话,看看他们会用什么方法。
  • 您的第一种方法确实对我有帮助,我正在创建一个临时变量,然后将值写入工作表,然后清除临时变量内存。客户同意这种方法。
猜你喜欢
  • 2011-11-05
  • 2011-01-14
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2011-10-24
  • 2022-01-12
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多