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