Java “Não foi possível reservar espaço suficiente para o heap do objeto”, embora haja RAM suficiente

7

Atualmente, estou tendo alguns problemas com o Java. Não será iniciado devido a problemas de heap. Mas eu tenho mais de 9 GB de RAM livre (ou mesmo 16 GB se você assumir que o cache estaria vazio). Este é o erro que recebo (e o comando free )

root@server: ~ # java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

root@server: ~ # free
             total       used       free     shared    buffers     cached
Mem:      25165824   15941148    9224676          0          0    7082176
-/+ buffers/cache:    8858972   16306852
Swap:            0          0          0

Estou executando um Debian de 64 bits em um servidor virtualizado. O software de virtualização é o OpenVZ. Esta é a minha versão do Java (eu posso executar este comando depois de parar duas das minhas VM's (4 atualmente em execução)) :

root@server: ~ # java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

O que eu posso fazer?

Conforme solicitado:

root@server: ~ # cat /proc/meminfo
MemTotal:       25165824 kB
MemFree:        11723412 kB
Cached:          4597552 kB
Active:          9692308 kB
Inactive:        3322544 kB
Active(anon):    7411960 kB
Inactive(anon):  1005340 kB
Active(file):    2280348 kB
Inactive(file):  2317204 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               960 kB
Writeback:             0 kB
AnonPages:       8417300 kB
Shmem:             21504 kB
Slab:             427452 kB
SReclaimable:     383424 kB
SUnreclaim:        44028 kB

Reguest2:

root@server: ~ # cat /proc/user_beancounters
Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
 10023468:  kmemsize                399250512            506245120           5053325720           5558658292                    0
            lockedpages                     0                    8               246744               246744                    0
            privvmpages               6005602              6291447              6291456              6291456                  221
            shmpages                     8576                 8608               579124         579124289562                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numproc                       598                 1236                30000                30000                    0
            physpages                 4634494              6291456              6291456              6291456                    0
            vmguarpages                     0                    0              6291456  9223372036854775807                    0
            oomguarpages              1529371              2144671              6291456  9223372036854775807                    0
            numtcpsock                     62                  164                30000                30000                    0
            numflock                       25                   39                 1000                 1100                    0
            numpty                         13                   24                  512                  512                    0
            numsiginfo                     10                   75                 1024                 1024                    0
            tcpsndbuf                 3330352              4153232           1179110194           1684441906                    0
            tcprcvbuf                 1216896             34410032           1179110194           1684441906                    0
            othersockbuf               270504               537552            589555096           1094886808                    0
            dgramrcvbuf                     0                67048            589555096            589555096                    0
            numothersock                  287                  333                30000                30000                    0
            dcachesize              355559855            446054103           1103879952           1136996352                    0
            numfile                      4766                 7745               250000               250000                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numiptent                      14                   14                 1000                 1000                    0

root@server: ~ # java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

root@server: ~ # cat /proc/user_beancounters
Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
 10023468:  kmemsize                399246622            506245120           5053325720           5558658292                    0
            lockedpages                     0                    8               246744               246744                    0
            privvmpages               6005601              6291447              6291456              6291456                  233
            shmpages                     8576                 8608               579124         579124289562                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numproc                       598                 1236                30000                30000                    0
            physpages                 4635460              6291456              6291456              6291456                    0
            vmguarpages                     0                    0              6291456  9223372036854775807                    0
            oomguarpages              1529376              2144671              6291456  9223372036854775807                    0
            numtcpsock                     64                  164                30000                30000                    0
            numflock                       25                   39                 1000                 1100                    0
            numpty                         13                   24                  512                  512                    0
            numsiginfo                     10                   75                 1024                 1024                    0
            tcpsndbuf                 3365232              4153232           1179110194           1684441906                    0
            tcprcvbuf                 1249664             34410032           1179110194           1684441906                    0
            othersockbuf               270504               537552            589555096           1094886808                    0
            dgramrcvbuf                     0                67048            589555096            589555096                    0
            numothersock                  287                  333                30000                30000                    0
            dcachesize              355559855            446054103           1103879952           1136996352                    0
            numfile                      4768                 7745               250000               250000                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            dummy                           0                    0  9223372036854775807  9223372036854775807                    0
            numiptent                      14                   14                 1000                 1000                    0
    
por BrainStone 16.01.2014 / 18:13

4 respostas

9

OpenVZ & Memória

O failcnt está aumentando em privvmpages , portanto, seu contêiner não pode alocar mais espaço de memória virtual do host:

root@server: ~ # cat /proc/user_beancounters
Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
            privvmpages               6005601              6291447              6291456              6291456                 >233<
            physpages                 4635460              6291456              6291456              6291456                    0
            vmguarpages                     0                    0              6291456  9223372036854775807                    0
            oomguarpages              1529376              2144671              6291456  9223372036854775807                    0

Observe que memória virtual ! = memória física. Processos podem alocar até algo em torno da quantidade endereçável de memória virtual (32bit ~ 2G - 4G, 64bit 8 TB - 256 TB), mas isso não significa que páginas de memória física estão sendo usadas (uma página sendo um pedaço de memória de 4KB).

physpages é o número de páginas de memória física que seu contêiner pode usar.
oomguarpages são as páginas de memória garantida que o contêiner receberá quando o host estiver com memória restrita.
privvmpages é o número de páginas de memória virtual que seu contêiner pode usar. vmguarpages é a quantidade garantida de memória virtual da mesma maneira

Java

O Oracle Java alocará sempre um pedaço contíguo de memória virtual. Executar java sem argumentos em uma caixa resulta em 5M de memória real usada ( RSS ), mas 660M de espaço VM alocado ( VSZ ):

  PID COMMAND                        VSZ   RSS
20816 java                        667496  4912 

Observando os segmentos de memória do processo java em smaps arquivo mostra um pedaço de cerca de 500MB alocados, o resto é arquivos mapeados na memória e coisas normais do java.

Em um sistema que está ativo há algum tempo, o espaço da VM disponível se torna fragmentado à medida que os processos usam / partes livres dele. Um grep Vmalloc /proc/meminfo lhe dará VmallocChunk , que é o maior pedaço livre disponível atualmente. Se isso for baixo, o sistema tentará alocar mais quando java solicitar, afinal é praticamente ilimitado em uma caixa de 64 bits.

Corrigir

Informe seu host para configurar privvmpages e vmguarpages muito mais alto. Não é necessário que eles sejam iguais à memória física, pois isso afeta a forma como a memória do linux funciona

Você pode resolver o problema temporariamente descartando o cache de arquivos echo 1 > /proc/sys/vm/drop_caches , mas isso é apenas temporário.

Você pode limitar o bloco de memória java tenta alocar em tempo de execução com um mínimo Xms ou durante a execução com o máximo Xmx . Executando java com essas opções na minha máquina:

java -Xms10M -Xmx10M

reduz o tamanho virtual total para 140 MB ou mais com apenas um pedaço contíguo de 10 MB para o heap java alocado.

    
por 18.01.2014 / 11:43
6

No nosso caso, isso ajudou a restringir o tamanho de heap que a VM tenta reservar na inicialização.

Por exemplo, na linha de comando:

export _JAVA_OPTIONS='-Xms64M -Xmx128m'

ou para o Tomcat em [TOMCAT_HOME] /bin/setenv.sh

#!/bin/sh

JAVA_OPTS="-Xms64M -Xmx256M"

(Observe o sublinhado extra na linha de comando).

A explicação do nosso provedor é:

  • a VM java calcula um tamanho de heap inicial na inicialização
  • esse cálculo é baseado na RAM disponível.
  • algumas instalações de java em servidores privados virtuais (VPS) não refletem as restrições de memória do VPS ao calcular o tamanho de heap inicial. Em vez disso, eles baseiam seus cálculos no tamanho da memória do sistema de hospedagem. O que pode levar a uma quantidade de memória livre que não está disponível no VPS.
  • ao fornecer um tamanho de heap inicial por meio de JAVA_OPTS, a VM usa esses valores e não tenta calcular por conta própria.
por 31.08.2014 / 08:01
2

Provavelmente, você precisa alterar o tamanho de heap padrão do Java e experimentar estes argumentos:

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

por exemplo:

java -Xms64m -Xmx1512m

Este encadeamento pode ser útil

Verifique também o ulimit (o ulimit fornece controle sobre os recursos disponíveis para o shell e para os processos iniciados por ele):

ulimit -a 
    
por 18.01.2014 / 00:03
2

Você pode estar sem memória virtual.

Você está focado no uso de RAM (ou falta de), mas suas JVMs existentes estão reservando memória virtual, não RAM. Contanto que as páginas reservadas da memória não sejam acessadas, não há nenhum uso de RAM relatado para elas.

Embora o Linux geralmente mascare esse problema por suas configurações de superalocação, é bem possível que o fato de você estar executando em um ambiente virtualizado em nível de SO reduza / desative em excesso ou defina um limite de controle de recursos de memória virtual.

Em uma instância normal do sistema operacional (não em um contêiner), a maneira mais fácil de contornar isso é adicionar uma troca que permitirá que a memória reservada não perca memória RAM. Em um contêiner, a maneira de superar o problema também pode exigir o aumento da memória virtual disponível globalmente, mas, em geral, isso é feito simplesmente pela concessão de mais memória virtual ao contêiner.

    
por 18.01.2014 / 00:42

Tags