Java - ошибка странного пространства кучи продолжает появляться

Люди. Это очень распространенная ошибка, но независимо от того, что я делаю, я просто не могу найти способ обойти это. Я использую IDEA IntelliJ, и уже довольно давно я пытаюсь внедрить работающую систему семантической маркировки ролей (SRL), и, наконец, я решил использовать модель PathLSTM ( https://github.com/microth/PathLSTM), чтобы сделать то же самое.

Проблема в том, что этот алгоритм зависит от файлов модели размером 2,7 ГБ, используемых для анализа.( https://drive.google.com/uc?id=0B5aLxfs6OvZBYUk2b0hLZjNqY3c&export=download)

Это выбрасывает мне недостаточно места в куче - Ошибка нехватки памяти


Loading pipeline from 
C:\Users\Vyso\Downloads\NLP\SRL\SEMAFOR\absSemafor\LTH\wttv\PathLSTM-pre-
illinois-built\srl-ACL2016-eng.model
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.reflect.Array.newInstance(Array.java:75)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1883)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1919)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1919)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1529)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)

Process finished with exit code 1

Естественно, я изменил пространство кучи как JVM в моей системе, так и в моей IDE, где я мог изменить vmoptions, следующим образом.(По умолчанию это -Xms128m и -Xmx512m).


# custom IntelliJ IDEA VM options

-Xms2048m
-Xmx4000m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow

Но даже после назначения около 4G в качестве пространства Max Heap я получаю ошибку. Забавно то, что на панели инструментов управления памятью в моей IDE я вижу, что код использует максимум 500 м во время выполнения, поэтому я действительно не знаю, как эта ошибка кучи все еще генерируется.

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

Благодарю вас.

1 ответ

Здесь есть два разных экземпляра JVM:

  • JVM, которая работает IDEA
  • JVM, которая работает PathLSTM

Я подозреваю, что проблема здесь с JVM, которая выполняет PathLSTM. Чтобы предоставить это не значения по умолчанию для -Xms, -Xmx тебе нужно идти в Run > Edit Configurations ... а затем выберите конфигурацию запуска для ваших вызовов PathLSTM, а затем добавьте -XmsNNNm -XmxYYYm к VM options вход.

Вы можете использовать JVisualVM (вы найдете это в каталоге bin вашего JDK), чтобы увидеть, сколько памяти используется при запуске PathLSTM. Запустите IDEA, затем запустите JVisualVM, и вы увидите что-то (вероятно, с именем "Идея") под локальным узлом в представлении дерева приложений, затем запустите все, что запускает PathLSTM, и вы увидите, что другая запись появится под локальным узлом, нажмите на нее, а затем выберите вкладку "Монитор". По умолчанию отображаемый там верхний правый график показывает использование памяти выбранным приложением. Вы, скорее всего, увидите, что используемая куча растет, пока этот процесс не получит OOM, а затем -Xmx в Run > Edit Configurations ... и повторите попытку, пока не найдете нужное значение. Или, в качестве альтернативы, выберите очень большое значение и затем позвольте JVisualVM показать вам фактическое максимальное использованное значение, а затем отредактируйте -Xmx чтобы соответствовать этому максимуму.

Ключевые моменты здесь:

  • Любые изменения, которые вы вносите в конфигурацию размера кучи, должны быть внесены в экземпляр JVM, который фактически выполняет PathLSTM, вы настраиваете эту JVM через Run > Edit Configurations ...
  • Вы можете использовать JVisualVM для мониторинга работы этой JVM
  • Для> 2 ГБ кучи вам нужно использовать 64-битную JVM
Другие вопросы по тегам