Tenho 1GB de RAM “sobrando” no servidor. Portanto, não é falta de memória.
Outro problema seria o sistema operacional ser de 32 bits, mas vi tópicos no fórum da Oracle de pessoas reclamando do erro, mesmo usando um OS com 64-bit.
[quote]
There is insufficient memory for the Java Runtime Environment to continue.
Native memory allocation (malloc) failed to allocate 131080 bytes for Chunk::new
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 (allocation.cpp:317), pid=31443, tid=850983792
JRE version: 6.0_26-b03
Java VM: Java HotSpot™ Server VM (20.1-b02 mixed mode linux-x86 )
--------------- T H R E A D ---------------
Current thread (0x09f4a400): JavaThread “C2 CompilerThread1” daemon [_thread_in_native, id=31452, stack(0x32b0f000,0x32b90000)]
Acredito que não, swap não está sendo usada.
Estranho que eu possuia 2GB de RAM no servidor, depois que subi a memória para 3GB que começou a acontecer os problemas.
[quote=pmlm][quote=asaudate]Já tentou seguir as sugestões do stak trace?
[quote]
Use 64 bit Java on a 64 bit OS
[/quote][/quote]
Já tive um problema em que a solução foi exactamente a contrária. Usar Java de 32 bits no OS de 64 bits[/quote]
Poderia ser um bug específico da VM 64 bits. Ou um gerenciamento melhor de memória (já que, pelo fato da palavra ter a metade do tamanho, ela naturalmente ocupa menos espaço). Ou apresentar alguma espécie de restrição em relação ao SO (criação / cache de threads). Enfim, não dá pra falar que seu caso é regra; está mais para exceção.
Ou isso é um bug horrendo em que a equipe de engenharia da oracle deixou passar, e que provavelmente iria arrebentar com vários sistemas e softwares no mundo ou você está completamente enganado.
Eu acredito na segunda opção. Numa boa.
Esse tipo de problema pode acontecer fora da máquina virtual se fosse usar uma interface jni em algum assembly(dlls). Por exemplo um método que aloca memória e não a libera no final do uso. Pode estar até mesmo no alto nível. O profiler ou a jvisualvm não acusam nada?