MetaMap java.lang.OutOfMemoryError: пространство кучи Java - PullRequest
0 голосов
/ 04 января 2019

Мы продолжаем сталкиваться с ошибкой java.lang.OutOfMemoryError: Java heap space при запуске MetaMap (с Java API и оболочкой UIMA).

К сожалению, журналы не очень информативны, поэтому мы не знаем, на какой файл он тянет.

В прошлом у нас были проблемы с созданием MetaMap огромных круглых аннотаций, когда он встречал символ трубы (|). Однако используемый нами набор файлов ( примечания MIMIC ) не содержит символов канала. Есть ли другие символы, которые могут проявлять поведение, аналогичное символу трубы?

Мы могли бы увеличить системную оперативную память, чтобы обойти проблему с пространством кучи (на самом деле она не может использовать максимальную установленную кучу, которая установлена ​​в 6 ГБ, поскольку системная память ограничена), но мы бы предпочли знать, что вызывает проблема, тем более что размер выходного файла стал более управляемым.

* РЕДАКТИРОВАТЬ *

Просто для пояснения: мы увеличили ресурсы памяти для JVM, и это действительно помогает передавать данные (это было проверено на локальной ВМ). Проблема, с которой сталкивается MetaMap, заключается в том, что он создает огромные циклические аннотации, которые поглощают ресурсы JVM (а в нашей нынешней системе ОЗУ ОС не оптимальна).

Как отмечено в моем комментарии ниже, мы предварительно обрабатываем файлы, чтобы лишить их любых символов, которые выдают ошибки. Однако ошибка пространства кучи раздражает, поскольку, в отличие от других ошибок, с которыми мы сталкиваемся (например, пробелы, окружающие одиночный период, как в text . text), они просто генерируют ошибку синтаксического анализа с текстом, который выдает ошибку. В случае символа канала мы нашли его, увеличив объем ОЗУ (на ВМ, на котором мы первоначально тестировали это), а затем посмотрев аннотации в средстве просмотра UIMA. Нам удалось идентифицировать проблемные файлы, поскольку размер выходного файла XMI с циклическими аннотациями огромен.

Мы снова запускаем некоторые тесты на ВМ, чтобы посмотреть, сможем ли мы определить проблему, но если у кого-то есть опыт работы с MetaMap, чтобы помочь нам определить какие-либо проблемные символы или последовательности символов, это было бы желательно.

* РЕДАКТИРОВАТЬ 2 *

Память не должна быть проблемой. Мы запускаем приложение, используя export JAVA_TOOL_OPTIONS='-Xms2G -Xmx6G -XX:MinHeapFreeRatio=25 -XX:+UseG1GC'

Существует фундаментальная проблема с круговыми аннотациями, которые мы пытаемся решить. Это поглощает ресурсы и рвет.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Ваше Java-приложение очень вероятно использует для ограничения выделенного пространства кучи, и оно достигает точки, где сборщик мусора не может эффективно получить необходимое пространство кучи.

Учитывая, что ваше приложение эффективно использует выделенное пространство кучи, я думаю, что единственный вариант - увеличить выделенное пространство кучи. Вы можете сделать это busing

java -Xmx2048m -jar YourApp.jar

Однако, возможно, стоит проанализировать, как используется пространство кучи. Есть инструменты, которые позволяют вам сделать это. Если вы используете IntelliJ, вы можете попробовать использовать плагин VisualVM.

0 голосов
/ 12 января 2019

Решение было в два раза:

Существует переменная среды UIMA JVM, которую необходимо установить как export UIMA_JVM_OPTS="-Xms128M -Xmx5g"

И, во-вторых, есть переключатель MetaMap, который уменьшает глубину рекурсии для создания аннотаций (что находится в конфигурационном файле MetaMapApiAE.xml):

<configurationParameterSettings>
    ... previous settings omitted ...
   <nameValuePair>
     <name>metamap_options</name>
     <value>
       <string>--prune 30</string>
     </value>
   </nameValuePair>
</configurationParameterSettings>
0 голосов
/ 04 января 2019

Я хотел бы добавить рекомендации от оракула статья по устранению неисправностей

Исключение в потоке имя_потока: java.lang.OutOfMemoryError: Пространство кучи Java

Подробное сообщение пространство кучи Java указывает, что объект не может быть выделяется в куче Java. Эта ошибка не обязательно подразумевает утечка памяти

Возможные причины:

  1. Простая проблема конфигурации, когда указанный размер кучи

    недостаточно для приложения.

  2. Приложение непреднамеренно хранит ссылки на объекты и это предотвращает сборку мусора.
  3. Чрезмерное использование финализаторов.

Еще один потенциальный источник этой ошибки возникает в приложениях, которые чрезмерно использовать финализаторы. Если у класса есть метод finalize, тогда объекты этого типа не освобождают пространство для мусора время сбора

После сборки мусора объекты помещаются в очередь для завершения, что происходит позже. финализаторы выполняются потоком демона, который обслуживает очередь финализации. Если поток финализатора не может идти в ногу с очередью финализации, тогда куча Java может заполниться, и будет выдано исключение OutOfMemoryError.

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

...