estoy recibiendo esta excepción en Java:Demasiados archivos abiertos: cuántos están abiertos, lo que son, y cuántos puede la JVM abierta
java.io.FileNotFoundException: (Too many open files)
Busco las formas de eliminar este problema.
Este error obviamente indica que JVM ha asignado demasiados controladores y el sistema operativo subyacente no permitirá que tenga más. O tengo una fuga en algún lugar con conexiones/secuencias mal cerradas.
Este proceso se ejecuta durante días sin parar y, finalmente, arroja la excepción. Ocurre repetidamente después de 12-14 días de tiempo activo.
¿Cómo luchas contra esto? ¿Hay alguna manera de obtener una lista de identificadores asignados en JVM o hacer un seguimiento cuando alcanza cierta cantidad? Me encantaría que se impriman y ver cómo crece y cuándo. No puedo usar un generador de perfiles porque es un sistema de producción y tengo dificultades para reproducirlo en desarrollo. ¿Cualquier sugerencia?
Estoy monitoreando el tamaño de montón libre y generando una "alarma" cuando se acerca al 1% del total especificado en -Xmx. También sé que si mi número de hilos llega a más de 500, algo definitivamente se va de las manos. Ahora, hay una forma de saber que mi JVM asigna demasiados identificadores del sistema operativo y no los devuelve, p. enchufes, archivos abiertos, etc. Si lo hubiera sabido, sabría dónde buscar y cuándo.
¿Puede dar más información sobre la JVM y el sistema operativo? Además, le sugiero que haga un mayor esfuerzo para reproducir esto en un entorno de desarrollo. Puede ser una molestia, pero cuando tienes ese problema, tratar de "observar e informar" en un sistema de producción probablemente demorará más. – Timothy
Ocurre repetidamente en Linuxes que se ejecutan virtualizados y realmente no tenemos una opción para reproducir esto ejecutando 2 semanas de pruebas cargadas pesadas. Sin embargo, no he visto esto en los cuadros de Windows. Tienes razón, es mejor atraparlo en el desarrollo, pero también me gustaría tener alguna capacidad integrada en el servidor para autocontrol para el futuro. – Dima
RE su edición. No creo que la JVM pueda decirle cómo se abrió ningún archivo. Esa podría ser una buena característica para Sun, pero hasta entonces deberá usar un proceso externo para contarle. Si realmente lo necesita dentro de la JVM escriba un código que ejecute lsof y devuelva el resultado. Además, se puede modificar el límite de archivos abiertos. Por ejemplo, en Linux puede modificar el archivo /etc/security/limits.conf. – bramp