utiliza significa que programacion para estructura eficiente compilar caracteristicas java jvm

java - significa - que es jvm en programacion



Demasiados archivos abiertos: cuántos están abiertos, qué son y cuántos puede abrir la JVM. (4)

Obtengo esta excepción en Java:

java.io.FileNotFoundException: (Too many open files)

Estoy buscando la manera de eliminar este problema.

Este error obviamente indica que JVM ha asignado demasiados identificadores y que 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 forma 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 pila 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 manera de saber que mi JVM asigna demasiados identificadores del SO y no los devuelve, por ejemplo, sockets, archivos abiertos, etc. Si lo hubiera sabido, sabría dónde buscar y cuándo.


Como usted está en Linux, le sugiero que compruebe el / proc-Filesystem. Dentro del proceso, encontrará una carpeta con el PID de su proceso que contiene una carpeta llamada ''fd''. Si su ID de proceso es 1234, la ruta es

/proc/1234/fd

Dentro de esa carpeta, encontrarás enlaces a todos los archivos abiertos (haz una ''ls -l''). Por lo general, puede decir por el nombre de archivo qué biblioteca / código puede abrir y no cerrar el archivo.


No dijiste en qué sistema operativo estás ejecutando, pero si estás ejecutando en Linux puedes usar el comando lsof

lsof -p <pid of jvm>

Eso mostrará una lista de todos los archivos abiertos por la JVM. O si está ejecutando en Windows puede Process Explorer que mostrará todos los archivos abiertos para todos los procesos.

Se espera que esto le permita restringir qué parte del código mantiene los archivos abiertos.


Puede cambiar el límite de archivos abiertos añadiendo lo siguiente a /etc/security/limits.conf :

* soft nofile 2048 # Set the limit according to your needs * hard nofile 2048

Luego puede volver a cargar la configuración usando sysctl -p en el shell. Revisa este artículo .

Solo para completar, puedes verificar cuál es el límite actual para los archivos abiertos usando: ulimit -n


Entonces, respuesta completa (combiné las respuestas de @phisch y @bramp). Si desea verificar todos los procesos, debe usar sudo . También es bueno guardar el resultado en el archivo - lsof no es barato + este archivo podría ser útil para futuras investigaciones.

sudo lsof > lsof.log

Mostrar malos:

cat lsof.log | awk ''{ print $2 " " $1; }'' | sort -rn | uniq -c | sort -rn | head -5 2687 114970 java 131 127992 nginx 109 128005 nginx 105 127994 nginx 103 128019 nginx

Guarde la lista de descriptores de archivo en el archivo también:

sudo ls -l /proc/114970/fd > fd.log

Mostrar los mejores archivos abiertos:

cat fd | awk ''{ print $11 }'' | sort -rn | uniq -c | sort -rn | head -n20