Исключение пространства кучи Java java.lang.OutOfMemoryError - PullRequest
3 голосов
/ 22 августа 2011

Я занимаюсь разработкой приложения для обнаружения плагиата, которое включает в себя большую часть обработки документов.Для индексации документов я использую 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 ]

6 голосов
/ 22 августа 2011

Исключением является ошибка, связанная с кучей (не permgen или другими конкретными пробелами), поэтому единственным параметром для настройки будет -Xmx, и вот мои предложения:

Используйте JVM для использованиябольше памяти с помощью -Xmx - попробуйте 1G: -Xmx1024m

Если это приведет к возникновению этой же ошибки,

  • Запустите JVM с аргументом -XX: + HeapDumpOnOutOfMemoryError, это даст вамдамп кучи, когда программа входит в OOM.
  • Используйте инструмент, подобный visualVM , для анализа полученного дампа кучи.Это поможет в выявлении утечек памяти.

Кроме этого, нет общего решения для исправления java.lang.OutOfMemoryError: Java heap space - Это может быть очень сильно зависит от приложения.

2 голосов
/ 22 августа 2011

Было бы полезно, если бы вы сообщили нам, какие типы переменных вы используете для хранения индекса документа и сообщаемых результатов.

Попробуйте запустить приложение создания отчетов в отдельной 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. пытается скопировать массив (это поведение по умолчанию при выращивании вектора)
  3. исчерпывает доступную память и выдает исключение OutOfMemoryError

Трассировка стека не упоминаетсяточный массив, но он должен быть большим.

Вопрос: Как вы храните заполненный индекс и куда помещаете результаты отчета?Так как вы еще не сказали, какую структуру, я предполагаю на данный момент Вектор, который удобно использовать, когда вы не знаете, сколько у вас данных, но также очень расточительно, когда его емкость увеличивается.Если не указано иное, он будет удваиваться по размеру каждый раз, когда ему нужно больше места, поэтому начальный размер в 100 байт может быстро превратиться в десятки мегабайт, что почти наполовину из новой комнаты опустеет.

Следующие две строки взяты из вашего кода сообщения.Я бы предположил, что часть пользовательского интерфейса модуля отчетности имеет ссылку на массив / вектор / список, заполняемый данными.Сообщите нам, какой это тип.

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

Строка ниже подразумевает, что исключение происходит после того, как вы нажали кнопку, возможно, «Просмотр результатов», которая запускает отчет.

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

Это означает, что результаты доступны и ожидают отображения.Если это так, то вам нужен лучший способ изолировать результаты.

Как насчет показа только одной страницы результатов за раз.Показать только первые 10 строк, затем показать следующие 10 и т. Д.

...