【问题标题】:FOP - OutofMemoryError while generating PDF from database dataFOP - 从数据库数据生成 PDF 时出现 OutofMemoryError
【发布时间】:2012-04-29 05:11:03
【问题描述】:

我是一名新的软件开发人员,确实需要一些帮助。我的任务是使用 FOP 从数据库中的数据生成 PDF。我编写了该程序并且它可以工作,但并非在所有情况下都可以。只要我检索的数据行数相当少——最多不到 10000 行,一切都会正常工作。当我尝试为大于 10000 行的数据集生成报告时,出现内存不足错误(Java 堆空间)。

从数据库中读取的代码:

while (rs.next()) {
   EMP_ID = rs.getString("EMP_ID");
   EMP_NAME = rs.getString("EMP_NAME");
   EMP_SALARY = rs.getString("EMP_SALARY");
   EMP_PROJECT = rs.getString("EMP_PROJECT");
   EMP_POSITION = rs.getString("EMP_POSITION");
   team.addMember(d.DataGetSet(EMP_ID, EMP_NAME, EMP_SALARY, EMP_PROJECT,
         EMP_POSITION));
}

我将程序的内存增加到 2GB,但仍然出现错误。任何解决此问题的帮助将不胜感激。

【问题讨论】:

  • 如果不看一些代码,就很难诊断出你的程序可能出了什么问题。请在您的问题中添加相关部分。
  • while (rs.next()) { EMP_ID = rs.getString("EMP_ID"); EMP_NAME = rs.getString("EMP_NAME"); EMP_SALARY = rs.getString("EMP_SALARY"); EMP_PROJECT = rs.getString("EMP_PROJECT"); EMP_POSITION = rs.getString("EMP_POSITION"); team.addMember(d.DataGetSet(EMP_ID, EMP_NAME, EMP_SALARY, EMP_PROJECT, EMP_POSITION)); }
  • tats 我用来检索数据并将其传递给 getter 和 setter 方法的循环,还将它添加到名为成员的 Arraylist 中,以便我可以使用它写入 xml 或 fo 文件
  • 我相信你的 team.addMember() 正在创建某种内存中的集合,它只是被填充。虽然 10k 看起来很小,但这可能是个问题。
  • 好的,那么我如何将我的所有数据移动到一个数组中,以便我可以将它用于下一步创建 xml 或 fo 文件.....

标签: java database pdf-generation apache-fop


【解决方案1】:

如果您的内存不足并且不知道从哪里开始,我建议您采用分而治之的方法来引导您进入正确的领域。例如,注释掉创建 PDF 的代码,然后再次测试。它会耗尽内存吗?如果是这样,请注释掉添加到数组中的部分(但保持对d.DataGetSet 的调用)并再次测试。这有望让您知道在哪里进行攻击,而无需学习如何分析 Java 内存(它有自己的学习曲线)。

如果您仍然没有成功,请尝试使用 JVisualVM(JDK 的一部分)。在应用程序运行时将其连接到您的应用程序并执行“堆转储”。这可能会帮助您发现占用如此多内存的原因。

最后 - 你确定你增加了内存并且生效了吗?仔细检查一下。

【讨论】:

    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多