OutOfMemoryError: не мог создать новый собственный поток без очевидной причины

При запуске моего кивнувшего Сервера Minecraft с помощью Java я получаю следующую ошибку:

java.lang.OutOfMemoryError: unable to create new native thread

Таким образом, мое первое предположение было, это, возможно, что-то создает слишком много потоков, превышая предел, но сервер только создает приблизительно 50 потоков, увеличивая общее число потоков на моей машине от 420 до 470, который нигде не является около моего предела. Я также не думаю, что память должна быть проблемой, так как я дал моему серверу приблизительно 8 ГБ, которых должно быть более чем достаточно для запуска.

Вот команда Java, я использую для запуска сервера:

java -server -XX:PermSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2 -XX:+AggressiveOpts -jar forge.jar -Xms8G -Xmx8G nogui -Dfml.queryResult=confirm

Я использовал следующую команду для подсчета общего количества потоков

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'

Как описано здесь.

Я выполнил ту команду вручную многократно и сразу прежде чем сервер отказал, количество было в 470. Таким образом, если сервер не создавал больше чем 700 тысяч потоков менее чем через секунду, предел не должен был быть превышен.

Все еще перед разрушенным сервером, мой удар давал мне эти ошибки:

-bash: fork: retry: Resource temporarily unavailable

который позволяет мне полагать, который там действительно был достигнут, некоторый предел и проблема не только в vm.

Мой сервер имеет 32 ГБ RAM и согласно вершине, использование памяти процесса Java было в менее чем 6%, которые составят меньше чем 2 ГБ, таким образом, vm должен будет иметь более чем достаточно памяти в запасе.

Согласно этому поиску и устранению неисправностей, другое значение OutOfMemoryError могло состоять в том, что существует недостаточно памяти, оставленной создать новые потоки, но так как только 6 из моих общих 32 ГБ используются, это не должно быть проблемой также.

Таким образом, так как количество потока хорошо находится под пределом и существует более чем достаточно оставленной памяти (в vm и остальной части системы), что еще могло быть проблемой?

Это пределы, которые в настоящее время устанавливаются:

mc@h*******:~$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 772691
max locked memory       (kbytes, -l) 16384
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 772691
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Моя версия Java:

mc@h*******:~$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Моя версия Ubuntu:

mc@h*******:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

Я пытался создать использование threaddump jstack -l <PID> >> threaddump.log. В то время как сервер запускает, и все все еще работает нормальным, файл журнала похож на это:

Error occurred during initialization of VM
java.lang.OutOfMemoryError: unable to create new native thread

Когда сервер почти закончил запускаться (незадолго до того, как катастрофические отказы сервера с OutOfMemoryError), журнал похож на это:

# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /home/mc/hs_err_pid24081.log

Я загрузил журнал ошибок здесь.

1
задан 6 October 2018 в 00:58

1 ответ

Начиная с переустановки JDK Oracle не помог, я попробовал OpenJDK, и это работало. OutOfMemoryErrors теперь ушли, и все работает как ожидалось.

Править

Это кажется, как переключение JDK действительно только помогал временно. Но я просто узнал реальный источник проблемы. Это кажется, как OutOfMemoryError был вызван определенной модификацией, которая была в обоих modpacks, который я попробовал. Я все еще не знаю, как OOME произошел без увеличенного количества потока или полной памяти, но так или иначе.

Модификация, которая вызвала проблемы, была Звездным Колдовством (версия 1.12.2-1.9.4). Таким образом, при столкновении с теми же проблемами с кивнувшим сервером Minecraft попытайтесь удалить ту модификацию.

0
ответ дан 7 December 2019 в 23:01

Другие вопросы по тегам:

Похожие вопросы: