Esto puede no ser práctico en su caso, pero lo que hice una vez cuando tuve un problema similar con las conexiones de bases de datos abiertas fue anular la función "abrir" con la mía. (Convenientemente ya tenía esta función porque habíamos escrito nuestra propia agrupación de conexiones). En mi función, agregué una entrada a una tabla que registraba la apertura. Hice una llamada de seguimiento de pila y guardé la identificación de la persona que llama, junto con la hora de llamada y olvido qué más. Cuando se lanzó la conexión, borré la entrada de la tabla. Luego tuve una pantalla donde podíamos volcar la lista de entradas abiertas. Luego podría ver la marca de tiempo y ver fácilmente qué conexiones se han abierto durante cantidades de tiempo poco probables y qué funciones se han abierto.
De esto, pudimos rastrear rápidamente las dos funciones que estaban abriendo conexiones y no cerrarlas.
Si tiene muchos identificadores de archivo abiertos, lo más probable es que no los cierre cuando termine en algún lugar. Dice que ha comprobado si hay bloques de try/finally correctos, pero sospecho que en alguna parte del código se ha saltado una mala, o tiene una función que tiene y nunca llega al final. Supongo que también es posible que realmente estés cerrando correctamente cada vez que abres un archivo, pero estás abriendo cientos de archivos simultáneamente. Si ese es el caso, no estoy seguro de qué puedes hacer, aparte de un rediseño serio del programa para manipular menos archivos, o un rediseño serio del programa para poner en cola tus accesos de archivos. (En este punto agrego el habitual, "Sin conocer los detalles de su aplicación, etc.)
con un lsof -p PID, la entrada más común es el siguiente: java 19157 dev 131u UNIX 105,98572 0t829 55050244/dispositivos/seudo/tl @ 0: ticots -> (socketpair: 0x1810c) (0x300199eed50) ¿Alguna idea de lo que esto significa y cómo puedo combatirlo? – dlinsin