Java no Linux memória insuficiente, embora haja bastante memória disponível sendo usada para armazenamento em cache

3

Estou tentando iniciar um processo no Red Hat Enterprise Linux Server 6.5 (Santiago), que está falhando porque não é capaz de alocar memória suficiente.

# 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:

O problema não está no próprio aplicativo Java - também recebo o erro quando simplesmente executo:

java -version

Analisando o consumo de memória:

free -m

             total       used       free     shared    buffers     cached
Mem:         32069      31276        792          0        556      16948
-/+ buffers/cache:      13771      18297
Swap:         9325         38       9287

So Mem está relatando que 31 dos 32 Gb de memória estão sendo usados, mas deve haver 18Gb de memória disponível que está sendo usada pelo cache. O sistema operacional não deve liberar parte disso quando um processo solicitar memória?

Os detalhes do dump de erro são

#
# 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
    
por notdazedbutconfused 28.01.2015 / 12:17

3 respostas

1

Dê uma olhada na memória jvm min max, você usa algum servidor web? Olhe para o número de degraus, configurações de memória para ele, para o Tomcat a maioria deles é @ server.xml. Analise o link do Controle de Missão do Java para obter informações adicionais . O Linux geralmente mantém mais memória para estar pronta quando solicitado. Para Java no Linux, apenas algo como o JMC pode ajudá-lo a ter uma ideia do que está acontecendo. Dê uma olhada na saída padrão da JVM.

    
por 28.01.2015 / 12:27
0

Parece que o problema não tem nada a ver com memória, mas com limites de processo. O usuário que estou executando o processo como tinha um limite de processo muito baixo definido para 1024.

ulimit -u
1024

e a contagem de threads de todos os processos executados por esse usuário é próxima a isso:

ps -eLf | grep 'myuser' | wc -l
1022
    
por 28.01.2015 / 13:41
-2

"free -g" lhe dará o uso de memória atual, se você não tiver memória suficiente, então aumente a RAM física ou aumente o espaço de troca.

se você tiver memória suficiente, o próximo passo seria aumentar a contagem máxima de processos do usuário.

altera a configuração ulimit (adicione linhas abaixo no final)

vi /etc/security/limits.conf

* nproc soft 65535

* hard nproc 65535

* soft nofile 65535

* no disco rígido 65535

vi /etc/security/limits.d/90-nproc.conf * soft nproc 65535

* hard nproc 65535

* soft nofile 65535

* no disco rígido 65535

    
por 03.01.2018 / 09:19