Java堆空间异常java.lang.OutOfMemoryError

时间:2011-08-22 16:33:12

标签: java exception heap-memory

我正在开发一个涉及大量文档处理的抄袭检测应用程序。为索引文档,我正在使用Apache Lucene,我使用Apache solr作为文档服务器。我使用Jasper报告作为报告模块。在处理完所有文档并检测到抄袭之后,我调用了一个使用Jasper报告开发的接口,当时发生了java堆空间异常。我试图增加应用程序中的堆空间,但仍然抛出相同的异常。是否有任何建议可以帮助我解决这个问题。

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at reportingModule.PeerSearchUI.generateResults(PeerSearchUI.java:901)
at reportingModule.PeerSearchUI.setResultDetails(PeerSearchUI.java:833)
at gui.form.WizardForm.ViewButtonActionPerformed(WizardForm.java:1372)
at gui.form.WizardForm.access$1200(WizardForm.java:50)
at gui.form.WizardForm$13.actionPerformed(WizardForm.java:870)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

2 个答案:

答案 0 :(得分:6)

从您的异常中,错误与堆(不是permgen或任何其他特定空格)有关,因此唯一要调整的参数是-Xmx,所以这是我的建议:

让JVM使用-Xmx使用更多内存 - 试试1G:-Xmx1024m

如果最终导致同样的错误,

  • 使用参数-XX启动JVM:+ HeapDumpOnOutOfMemoryError这将为您提供 程序进入OOM时的堆转储。
  • 使用visualVM之类的工具 分析获得的堆转储。这将有助于识别记忆 泄漏。

除此之外,没有通用的解决方案来修复java.lang.OutOfMemoryError: Java heap space - 它可能非常适用于特定应用。

答案 1 :(得分:2)

如果您告诉我们您用于存储文档索引和报告结果的变量类型,将会有所帮助。

尝试在文档索引过程的单独JVM中运行报表应用程序。

索引文档是一项资源密集型操作,如果它保留了索引编制过程中使用的所有内存,然后您尝试查询报表的索引,它可能会消耗更多。

让我们从顶部看一下堆栈跟踪。前三行(按相反顺序阅读)显示了吸烟枪。

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space at     
java.util.Arrays.copyOf(Arrays.java:2760) at java.util.Arrays.copyOf(Arrays.java:2734) at 
java.util.ArrayList.ensureCapacity(ArrayList.java:167) at java.util.ArrayList.add(ArrayList.java:351) at 

JVM

  1. 检查数组的大小以查看它是否足够大
  2. 尝试复制数组(这是生成Vector时的默认行为)
  3. 耗尽可用内存并抛出OutOfMemoryError异常
  4. 堆栈跟踪没有提到确切的数组,但它必须是一个大数组。

    问题:您如何存储已完成的索引以及您将报告结果放在何处?由于你还没有说过什么结构,我现在假设一个Vector,当你不知道你有多少数据时,它会被使用,但是当它的容量增加时也非常浪费。如果没有另外说明,每次需要更多空间时它的大小将增加一倍,因此100字节的初始大小很快就会变成几十兆字节,几乎一半的新房间都空了。

    接下来的两行来自您的报告代码。我假设UI的报告模块部分引用了数据填充的数组/向量/列表。告诉我们它是什么类型。

    reportingModule.PeerSearchUI.generateResults(PeerSearchUI.java:901) at  
    reportingModule.PeerSearchUI.setResultDetails(PeerSearchUI.java:833) at 
    

    下面的一行表示您点击按钮后可能发生异常,可能会出现“查看结果”,这会启动报告。

    gui.form.WizardForm.ViewButtonActionPerformed(WizardForm.java:1372) at 
    

    这意味着结果可用并等待显示。如果这是真的,那么你需要有一种更好的方法来隔离结果。

    一次只显示1页结果怎么样?只显示前10行,然后显示下10行,等等。

相关问题