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.
È un JDK a 32 bit o 64 bit? – fge
È un jre a 32 bit (non jdk, colpa mia) –
E hai provato un JRE a 64 bit o JDK inveceN – fge