Tengo un programa Java que se ejecuta (en Linux) durante un tiempo y luego hace que el servidor se bloquee con "Demasiados archivos abiertos"
Después de reiniciar la máquina, ejecuto el programa java nuevamente y luego ejecuto el comando lsof contra su pid. Se produce una gran cantidad de líneas con la siguiente salida:
java 971 uknown 980u sock 0,9 0t0 20461 protocol: TCPv6¿Significa esto que el programa abre múltiples conexiones tcp y no las cierra?
¿Qué pasos adicionales puedo tomar para solucionar este problema?
Significa que su programa abre descriptores de archivos pero no los cierra. Pueden ser sockets o controladores de archivos. Entonces está causando una fuga de recursos. Asegúrese de que todos los controladores de archivos estén cerrados y prepárelos para la recolección de elementos no utilizados.
Como señaló dan1st en un comentario, una medida preventiva para evitar este escenario es probar con recursos. Esto implementará la interfaz AutoClosable y garantizará el cierre automático de recursos.