2011-06-22 7 views
6

lsof es una buena herramienta para Unix, que muestra todos los identificadores de archivo abiertos actualmente.lsof contraparte para una JVM?

¿Alguien conoce una herramienta similar que muestre todos los archivos abiertos dentro de una JVM en ejecución (a través de JVMTI o cualquier interfaz similar)?

En este caso particular, sería suficiente para mí saber qué clase tiene un asa abierta. El método/línea o incluso una cadena completa para la raíz de GC sería fantástico, pero la clase propietaria del controlador ya es un buen comienzo.

Sé que podría hacer un basurero, abrirlo en un generador de perfiles y descubrirlo, pero esta es una tarea tediosa, especialmente para los grandes montones.

+0

Le sugiero que utilice un mejor generador de perfiles. ;) En YourKit puedo ver todos los archivos abiertos mientras la aplicación se está ejecutando. –

+0

Uso YourKit, pero rara vez tiene perfiles habilitados en entornos en vivo. ¿O es compatible con YourKit mostrar los identificadores de archivos de los depósitos? – mindas

+1

Es compatible con mostrar FileDescriptor desde un volcado buscando por clase que se utiliza para todos los archivos abiertos. Puede ver dónde se están llevando a cabo referencias a cualquier archivo. –

Respuesta

1

La opción JVMTI parece que no sería una mala elección. El gran problema sería asegurarse de que envuelva todo lo que pueda abrir un manejador de archivo: básicamente, tendría que pasar por el código fuente de JDK y encontrar todas las funciones nativas que abrieron un archivo (distribuidas en java.io. , java.nio., creo que java.net. * También si considera los sockets como manejadores de archivos, y casi en cualquier otro lugar donde un identificador de archivo puede ser abierto por una función nativa) y luego los envuelve todos con la llamada SetNativeMethodPrefix.

Estoy asumiendo que es lo que algunas de las personas de perfiles hacer: sin embargo, si usted no está obligado a hacer este anuncio en tiempo real entonces yo creo que sería manera más fácil de utilizar lsof o handle (en Windows plataformas) y filtro para el ID de proceso de su JVM.

Cuestiones relacionadas