2014-12-03 12 views
11

Non riesco a eseguire java in un contenitore Docker sul mio server. Anche quando si emette java -version, ottengo il seguente errore.JVM non può memorizzare la memoria riservata durante l'esecuzione nel contenitore Docker

[email protected]:/# java -version 
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000035ce1000000, 2555904, 1) failed; error='Operation not permitted' (errno=1) 
# 
# There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (mmap) failed to map 2555904 bytes for committing reserved memory. 
# An error report file with more information is saved as: 
# //hs_err_pid17.log 

In base a ciò, java non può mappare 2,5 MB di spazio per la memoria riservata? Questo non mi sembra giusto ...

ho il log completo incluso alla fine, ma per il bene di qualche informazione in più, il mio sistema è segnalato la seguente:

[email protected]:/# uname -m 
x86_64 
[email protected]:/# free -mh 
      total  used  free  shared buffers  cached 
Mem:   15G  9.7G  5.8G  912K  148M  8.9G 
-/+ buffers/cache:  639M  14G 
Swap:   15G   0B  15G 

Qualcuno mi può puntare a la giusta direzione?

log completo: https://gist.github.com/KayoticSully/e206c44681ce261674ba

Aggiornamento

@Yobert inchiodato il problema e consiglio vivamente di leggere i commenti e chattare log. Buone informazioni in là.

Per chi vuole il comando finale che ha reso Java lavoro: setfattr -n user.pax.flags -v "mr" /usr/bin/java

Se la vostra distro non ha setfattr installato di default dovrebbero essere inclusi nel attr installabile pacchetto tramite Paceman, apt-get, ecc

risposta

13

Ho avuto lo stesso problema quando utilizzo un kernel abilitato per Grsec. Per giocare a java, ho dovuto disabilitare MPROTECT sul file java. È possibile utilizzare l'utilità paxctl per questo:

paxctl -m /usr/lib/jvm/java-7-openjdk/jre/bin/java 

Avrai bisogno di fare paxctl -c sul primo binario, se non hai mai usato su quel binario prima:

paxctl -c /usr/lib/jvm/java-7-openjdk/jre/bin/java 

Maggiori informazioni su paxctl può essere trovato a: http://en.wikibooks.org/wiki/Grsecurity/Additional_Utilities

+0

Questo è fantastico da sapere, ma non funziona per me ... Mi sono assicurato che il flag fosse disabilitato sull'effettivo binario java che è stato eseguito, ma lo stesso problema sta ancora accadendo. – KayoticSully

+0

Controlla dmesg-- dovresti vedere alcune cose lì quando provi ad eseguirlo se si tratta di un problema PAX. Inoltre c'è un modo più nuovo di impostare gli attributi di sicurezza tramite xattrs invece dell'header binario, se il kernel lo supporta.Forse hai la modalità legacy disabilitata? – Yobert

+0

Hmm, proverei a rimuovere più flag che solo m. Rimuoviamo pemrs per java (anche se non penso che sia idiomatico) – Yobert

8

ho avuto lo stesso problema quando si esegue Docker su Alpine Linux, dopo aver abilitato modalità soft pax funzionato:

sysctl -w kernel.pax.softmode=1 

La modalità Soft disabiliterà la maggior parte delle funzionalità PaX per impostazione predefinita, pertanto non è consigliabile attivarla. Il modo corretto è usare paxctl, come già detto sopra.

Anche dare un'occhiata qui: https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Support_soft_mode

+0

Questo non ha funzionato per me. Ho ottenuto: [91msysctl: errore: 'kernel.pax.softmode' è una chiave sconosciuta Ciò significa che il mio sistema non sta usando PaX? –

+0

Grazie. Questo ha funzionato per me in 3.7.0 standard e virtuale. –

1

Questo è accaduto anche a me, Abbiamo ridotto la dimensione della RAM sul nostro VM e dopo un paio di giorni ha iniziato a ricevere questo errore e il servizio non è venuta per sempre .

Soluzione :: Abbiamo ridotto la dimensione dell'heap dell'applicazione o del servizio con questo problema e il servizio si è risolto di nuovo bene.

Problemi correlati