Я пытаюсь запустить процесс в Red Hat Enterprise Linux Server версии 6.5 (Сантьяго), но это не удается, потому что он не может выделить достаточно памяти.
# 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:
Проблема не в самом приложении Java - я тоже получаю сообщение об ошибке, когда просто запускаю:
java -version
Смотрим на потребление памяти:
бесплатно -m
total used free shared buffers cached
Mem: 32069 31276 792 0 556 16948
-/+ buffers/cache: 13771 18297
Swap: 9325 38 9287
Итак, Mem сообщает, что используется 31 из 32 ГБ памяти, но должно быть 18 ГБ доступной памяти, которая используется кешем. Не должна ли ОС освобождать часть этого, когда процесс запрашивает память?
Подробная информация о дампе ошибки
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32 bit mode, the process size limit was hit
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
# Out of Memory Error (gcTaskThread.cpp:46), pid=40816, tid=140071992215296
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode linux-amd64 compressed oops)
--------------- T H R E A D ---------------
Current thread (0x00007f6508006800): JavaThread "Unknown thread" [_thread_in_vm, id=40817, stack(0x00007f650d46c000,0x00007f650d56d000)]
Stack: [0x00007f650d46c000,0x00007f650d56d000], sp=0x00007f650d56b7c0, free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x85ebd5] VMError::report_and_die()+0x265
V [libjvm.so+0x3e41b8] report_vm_out_of_memory(char const*, int, unsigned long, char const*)+0x68
V [libjvm.so+0x466ada] GCTaskThread::GCTaskThread(GCTaskManager*, unsigned, unsigned)+0x13a
V [libjvm.so+0x4655de] GCTaskManager::initialize()+0x21e
V [libjvm.so+0x465373] GCTaskManager::GCTaskManager(unsigned)+0x13
V [libjvm.so+0x722cad] ParallelScavengeHeap::initialize()+0x4dd
V [libjvm.so+0x836549] Universe::initialize_heap()+0xa9
V [libjvm.so+0x8360ea] universe_init()+0x7a
V [libjvm.so+0x4ac53b] init_globals()+0x4b
V [libjvm.so+0x81cc74] Threads::create_vm(JavaVMInitArgs*, bool*)+0x214
V [libjvm.so+0x51a7b0] JNI_CreateJavaVM+0x80
Загляните в jvm min max memory, вы используете какой-либо веб-сервер? Посмотрите количество ступеней, настройки памяти для него - для Tomcat большинство из них @ server.xml. Загляните в Java Mission Control http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html чтобы получить дополнительную информацию. Linux обычно оставляет больше памяти, чтобы быть готовым по запросу. Для Java в Linux только что-то вроде JMC может помочь вам понять, что происходит. Взгляните на стандартный вывод JVM.
Похоже, проблема не в памяти, а в ограничениях процесса. Пользователь, у которого я запускаю процесс, имел очень низкий предел процесса, равный 1024.
ulimit -u 1024
и количество потоков всех процессов, выполняемых этим пользователем, близко к этому:
ps -eLf | grep 'myuser' | wc -l 1022
"free -g" даст вам текущее использование памяти, если у вас недостаточно памяти, увеличьте физическую RAM или увеличьте пространство подкачки.
если у вас достаточно памяти, следующим шагом будет увеличение максимального количества пользовательских процессов.
vi /etc/security/limits.conf
* мягкий nproc 65535
* хард nproc 65535
* soft nofile 65535
* жесткий файл 65535
vi /etc/security/limits.d/90-nproc.conf * программный nproc 65535
* хард nproc 65535
* soft nofile 65535
* жесткий файл 65535