2013-07-25 14 views
7

Ho un'app java distribuita su tomcat 7 in esecuzione su ubuntu 10.04. C'è stato un problema durante l'apertura di un socket server che non ho potuto riproduco finora:java.net.SocketException: Impossibile allocare memoria (non Mac)

java.net.SocketException: Cannot allocate memory 
at java.net.PlainSocketImpl.socketBind(Native Method) 
at java.net.AbstractPlainSocketImpl.bind(Unknown Source) 
at java.net.ServerSocket.bind(Unknown Source) 
at org.subethamail.smtp.server.SMTPServer.createServerSocket(SMTPServer.java:338) 
at org.subethamail.smtp.server.SMTPServer.start(SMTPServer.java:291) 

Tutto quello che ho potuto scoprire è che questo accade su alcune specifica versione di MacOS, che non è rilevante per me e anche su OpenJDK, che non è rilevante neanche (sto usando Oracle JRE 1.7.0_17). Un'altra possibile ragione è un ambiente di virtualizzazione, ma nel mio caso ciò accade su una scatola di hardware.

Quindi, la domanda è: qualcuno ha mai affrontato lo stesso problema e quale potrebbe essere una possibile soluzione.

Aggiornamento C'è stato anche questa cosa: Tomcat ha consumato quasi tutto il mucchio, di circa 700MB, è stato causato da una perdita di memoria nel mio codice. Ma per quanto ho capito, l'eccezione indica un buffer di socket a livello di sistema, quindi non sembra essere correlato all'heap java. Tuttavia, questa è l'unica spiegazione che ho ottenuto finora ed è molto illusorio secondo me.

Update 2 Alla fine siamo stati in grado di riprodurre il problema diverse volte, quindi questo non era sulle perdite di memoria. Stavo considerando l'autenticazione come una possibile fonte del problema quando l'ho affrontato per la prima volta, ma sfortunatamente non ho prestato molta attenzione ad esso. Quando ho avuto un altro hardware box interessato dal problema, ho provato a collegare la porta non privilegiata e sono riuscito, mentre i tentativi di vincolare le porte privilegiate conducono ad eccezioni. Quindi, alla fine ho sostituito authbind con iptables.

In sostanza, i punti di risposta di Taher Fady a authbind, ma la risposta di Danny Thomas fornisce informazioni molto interresting sulle connessioni tra biforcazione e "Impossibile allocare memoria", realtà usiamo anche costruttore di processo per eseguire script bash, per cui v'è una grande occasione che il problema potrebbe essere causato da esso.

+0

È un JDK a 32 bit o 64 bit? – fge

+0

È un jre a 32 bit (non jdk, colpa mia) –

+0

E hai provato un JRE a 64 bit o JDK inveceN – fge

risposta

4

Suoni come se si dispone di memoria fisica insufficiente o di scambio - sui sistemi affe cted, controlla la memoria e lo swap.

La tua applicazione è in grado di eseguire comandi esterni - fork/exec potrebbe contribuire.Si potrebbe considerare che permette di memoria overcommit, se è questo il caso:

http://bryanmarty.com/blog/2012/01/14/forking-jvm/

+0

Grazie, Danny Thomas. Si è scoperto che authbind che stiamo usando sta eseguendo anche fork() sotto il cofano. Su rebind di picchi di utilizzo della memoria può causare l'errore descritto sopra, anche se l'heap non è ancora completamente esaurito. Quindi ci siamo liberati di authbind e il problema è stato risolto. – Jk1

+0

Ah, è fantastico. Felice di poterti aiutare! –

0
  • è possibile estendere lo spazio di controllo di Java heap per esso.
  • Se il progetto che si sta sviluppando è stato creato da un'altra versione java, il problema potrebbe verificarsi.
1

prega di controllare anche i seguenti articoli:

  • eseguire un test di memoria per eliminare blocchi di memoria difettosi controllo del disco
  • girano su partizione di swap (l'equivalente di cui su Mac OS)
  • Controllare limiti delle risorse utente (ulimit)
+0

grazie per la risposta. Questo problema si verifica su più installazioni hardware (almeno 10), quindi dubito che tutte abbiano il loro ram o disco rotto – Jk1

+0

@ JK1: Sareste stupiti dal tipo di coincidenze di errori hardware che potreste avere ... – carlspring

0

provare a ridurre la memoria allocata per Tomcat (il parametro -Xmx in catalina.sh). Aumenta anche la dimensione massima dell'heap di tomcat. Se non lo risolve, devi trovare perdite di memoria nel tuo codice, uno di questi è lo java melody, usarlo e trovare la perdita di memoria per risolvere il problema.

Problemi correlati