Cassandra генерирует ошибку «java.lang.OutOfMemoryError: пространство кучи Java» при запуске

Я обновил свою систему с 13.04 до 13.10, и я больше не мог запускать Cassandra, получая ошибку нехватки памяти, поэтому куча заполнялась, хотя все, что я делал в тот момент, это запускал сервер.

Я вошел и увеличил максимальный размер кучи с -Xmx1992m (по умолчанию) до -Xms2500m.

Мне интересно, зачем это нужно делать? Может быть, память немного уменьшилась между запуском ядра Linux 3.5.0 и переходом на ядро ​​3.11.0, и может ли это повлиять на Cassandra? (то есть, скажем, я «потерял» 200 МБ, теперь он выделял 1992 МБ вместо 2192 МБ с предыдущим ядром, может быть??)

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

При запуске Cassandra показывает следующее (разбито на 3 строки, чтобы было легче читать):

xss =  -ea -javaagent:bin/../lib/jamm-0.2.5.jar -XX:+UseThreadPriorities
       -XX:ThreadPriorityPolicy=42 -Xms1994M -Xmx2500M -Xmn400M
       -XX:+HeapDumpOnOutOfMemoryError -Xss256k

Обновлять:

Арх! Он все еще запускал OpenVMS, потому что переменная $JAVA_HOME, указывающая на /usr/lib/jvm/default-java (она определена в /etc/environment):

JAVA_HOME=/usr/lib/jvm/default-java

И каким-то образом он был настроен обратно на OpenVMS. Хотя я изменил программную ссылку /etc/alternatives/java, и, таким образом, java -version в моей командной строке «работал нормально» (возвращая то, что я ожидал), сценарий запуска Cassandra использует переменную $JAVA_HOME!

Поэтому я проверил список доступных виртуальных машин с помощью:

ls -l /usr/lib/jvm

lrwxrwxrwx 1 root root   24 Apr 27  2012 default-java -> java-1.7.0-openjdk-amd64
drwxr-xr-x 4 root root 4096 Feb 23 17:54 java-1.5.0-gcj-4.8-amd64
lrwxrwxrwx 1 root root   20 Sep  2  2012 java-1.6.0-openjdk-amd64 -> java-6-openjdk-amd64
lrwxrwxrwx 1 root root   20 Jul  3  2013 java-1.7.0-openjdk-amd64 -> java-7-openjdk-amd64
drwxr-xr-x 5 root root 4096 Oct  7  2012 java-6-openjdk-amd64
drwxr-xr-x 3 root root 4096 Oct  7  2012 java-6-openjdk-common
drwxr-xr-x 5 root root 4096 Sep 21 20:06 java-7-openjdk-amd64
drwxr-xr-x 8 root root 4096 Sep 18 21:18 java-7-oracle

И выполнил следующие две команды, чтобы запустить Oracle:

sudo rm /usr/lib/jvm/default-java
sudo ln -s java-7-oracle /usr/lib/jvm/default-java

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


person Alexis Wilke    schedule 24.02.2014    source источник
comment
32-битная или 64-битная JVM?   -  person Thorbjørn Ravn Andersen    schedule 25.02.2014
comment
Ой! Я хотел поместить информацию с параметрами и тому подобное. Я на 64бит. Используя Oracle, хотя он был установлен на OpenJVM, когда я перезагрузился, и не заметил этого до тех пор, пока я не протестировал его, поэтому он пытался несколько раз с OpenJVM. Обе версии 7.   -  person Alexis Wilke    schedule 25.02.2014
comment
Ой! Я сменил альтернативу на Oracle, но похоже этого недостаточно. Он использует /usr/lib/jvm/default-java/bin/java, и похоже, что это OpenJVM. Аррргх!   -  person Alexis Wilke    schedule 25.02.2014
comment
Итак, сколько памяти доступно в отчете простой тестовой программы Java?   -  person Thorbjørn Ravn Andersen    schedule 25.02.2014
comment
@ ThorbjørnRavnAndersen, понятия не имею. Я не пишу Java-код. -Xms и -Xmx определяют доступную для программного обеспечения кучу. Мне действительно трудно понять Cassandra, отчасти потому, что я сам не использую Java, и поэтому многие вещи действительно не ясны только в этом отношении.   -  person Alexis Wilke    schedule 25.02.2014
comment
Ваш способ установки версии Java по умолчанию неверен. Я бы посоветовал вам посмотреть на askubuntu.com, как это сделать. Также убедитесь, что вы используете 64-битную JVM. Openjdk должен подойти для ваших целей.   -  person Thorbjørn Ravn Andersen    schedule 25.02.2014
comment
Пакет, управляющий этой софтлинком, — это default-jre-headless, который не содержит никаких скриптов или двоичных файлов. Я не слишком уверен, как вы должны изменить эту ссылку. См. ответ Махеша здесь: askubuntu.com/questions/181381/   -  person Alexis Wilke    schedule 25.02.2014


Ответы (1)


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

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

Самый простой способ — просто убедиться, что вы выделили достаточный запас, чтобы небольшое увеличение не было проблемой.

person Tim B    schedule 24.02.2014
comment
Да... к сожалению, иногда это также означает, что что-то перестает работать, что очень раздражает. Например, в этот момент у меня вообще нет звука. Раньше это работало с тех пор, как я купил компьютер 4 или 5 лет назад. Позор действительно. - person Alexis Wilke; 25.02.2014