Al fin después de mucho luchar ya hallamos la respuesta de esta duda que muchos los usuarios de este sitio web han tenido. Si quieres aportar algo no dejes de dejar tu conocimiento.
Solución:
“java.net.SocketException: demasiados archivos abiertos” se puede ver en cualquier aplicación de servidor Java, por ejemplo, Tomcat, Weblogic, WebSphere, etc., con el cliente conectándose y desconectándose con frecuencia.
Tenga en cuenta que las conexiones de socket se tratan como archivos y utilizan el descriptor de archivo, que es un recurso limitado.
Los diferentes sistemas operativos tienen diferentes límites en la cantidad de identificadores de archivos que pueden administrar.
En resumen, este error se debe a que los clientes se conectan y desconectan con frecuencia. Si desea manejarlo por su cuenta, tiene dos opciones:
1) Aumentar el número de identificadores de archivos abiertos o descriptores de archivos por proceso.
En el sistema operativo basado en UNIX, por ejemplo, Ubuntu o Solaris, puede usar el comando ulímite -a para averiguar cuántos identificadores de archivos abiertos por proceso están permitidos.
$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 10
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2048
virtual memory (kbytes, -v) unlimited
Puede ver que archivos abiertos (-n) 256, lo que significa que solo se permiten 256 identificadores de archivos abiertos por proceso. Si su programa Java, recuerde que Tomcat, weblogic o cualquier otro servidor de aplicaciones son programas Java y se ejecutan en JVM, excede este límite, generará una excepción java.net.SocketException: Demasiados archivos abiertos.
Puede cambiar este límite utilizando ulimit -n a un número mayor, por ejemplo, 4096, pero hágalo con el asesoramiento del administrador del sistema UNIX y, si tiene un equipo de soporte de UNIX independiente, es mejor que se comunique con ellos.
2) Reducir el tiempo de espera para el estado TIME_WAIT en su sistema operativo
En los sistemas basados en UNIX, puede ver la configuración actual en /proc/sys/net/ipv4/tcp_fin_timeout expediente.
En el sistema basado en Windows, puede ver esta información en el registro de Windows. Puede cambiar el tiempo de espera de TCPTIME_WAIT en Windows siguiendo los pasos a continuación:
1) Open Windows Registry Editor, by typing regedit in run command window
2) Find the key HKEY_LOCAL_MACHINESystemCurrentControlSetServicestcpipParameters
3) Add a new key value pair TcpTimedWaitDelay asa decimal and set the desired timeout in seconds (60-240)
4) Restart your windows machine.
En la línea 438, obtiene la respuesta como un flujo y la convierte en un byte. array. El InputStream devuelto por entity.getContent() no se cierra. Esto podría estar contribuyendo al problema. Además, HttpEntity.consumeContent() está obsoleto por motivos relacionados.
También es posible que desee verificar el límite máximo de archivos abiertos de Linux. Este enlace relacionado es para un producto personalizado basado en Java, pero explica muy bien los pasos necesarios para solucionar el problema.
Agradecemos que quieras proteger nuestra publicación dejando un comentario y puntuándolo te damos la bienvenida.