java.net.SocketException: no se puede asignar memoria (no Mac)

Tengo una aplicación Java implementada en Tomcat 7 ejecutándose en Ubuntu 10.04. Ha habido un problema durante la apertura de un socket de servidor que no pude reproducir hasta ahora:

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)

Todo lo que he podido descubrir es que esto sucede en alguna versión específica de MacOS que no es relevante para mí, y también en OpenJDK, que tampoco es relevante (estoy usando Oracle JRE 1.7.0_17). Otra posible razón es un entorno de virtualización, pero en mi caso esto sucede en una caja de hardware.

Entonces, la pregunta es si alguien ha enfrentado el mismo problema y cuál podría ser una posible solución.

Actualización También ha habido esto: tomcat consumió casi todo el montón, aproximadamente 700mb, fue causado por una pérdida de memoria en mi código. Pero hasta donde yo entiendo, la excepción habla sobre un buffer de socket en el nivel del sistema, por lo que no parece estar relacionado con el montón de Java. Sin embargo, esta es la única explicación que tengo hasta ahora y es muy ilusorio en mi opinión.

Actualización 2 Finalmente, hemos podido reproducir el problema varias veces, por lo que no se trataba de pérdidas de memoria. Estaba considerando authbind como una posible fuente del problema cuando lo enfrenté por primera vez, pero desafortunadamente no le he prestado mucha atención. Cuando tuve otra caja de hardware afectada por el problema, traté de vincular un puerto no privilegiado y lo logré, mientras que los intentos de vincular puertos privilegiados condujeron a excepciones. Entonces, eventualmente he reemplazado authbind con iptables.

Básicamente, la respuesta de fady taher apunta a authbind, pero la respuesta de Danny Thomas proporciona información muy interesante sobre las conexiones entre bifurcación y "No se puede asignar memoria", en realidad también utilizamos el generador de procesos para ejecutar scripts de bash, por lo que hay una gran posibilidad de que el problema pueda ser causado por ello.

Respuesta 1

Parece que no tiene suficiente memoria física o intercambio: en los sistemas afectados, verifique la memoria e intercambie.

¿Su aplicación ejecuta comandos externos? Fork / exec podría estar contribuyendo. Puede considerar permitir un exceso de memoria, si ese es el caso:

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

Respuesta: 2

No sé si ayuda, pero verifique

Error de memoria al intentar cambiar el puerto Apache Tomcat de 8080 a 80

Respuesta: 3
  • Puede ampliar el espacio de almacenamiento dinámico de Java para comprobarlo.
  • Si el proyecto que está desarrollando ha sido creado por otra versión de Java, ese problema podría suceder.
Respuesta: 4

¿Alguien sabe cómo guardar una imagen de archivo con mostrar previamente un cuadro de diálogo para elegir dónde está la ubicación e ingresar un nombre del archivo? gracias por tu respuesta, lo aprecio

Hola a todos, tengo un error que rompe mi compilación sin ninguna razón, aquí está el mensaje de error: error: error al leer /.m2/repository/com/sun/jdmk/jmxtools/1.2.1/jmxtools-1.2.1.jar; error al abrir ...

Quiero generar el valor de la variable xzy en el valor de la variable abc. <c: set var = "abc" value = "<c: out value =" $ {xyz} "/>" /> Recibo un error (etiqueta <c: set> sin terminar) ...

Tenemos en compañía la aplicación que se desarrolló utilizando Java 7, Spring Framework 3.1.2, MyBatis 3.1.1, MyBatis Spring 1.2.2, JasperReports 6.1.0, etc. La aplicación funciona en Tomcat 7.0.35, utiliza ...