Averiguar qué sockets de red están abiertos en la máquina virtual de Java actual

Estoy escribiendo una prueba de extremo a extremo de que mi programa Java libera todos sus recursos: subprocesos, sockets de servidor, sockets de cliente. Es una biblioteca, por lo que liberar recursos al salir de la JVM no es una opción.Probando la liberación de hilos. Fue fácil, porque puedes pedir unThreadGroup para todos los subprocesos que contiene, pero todavía no he encontrado una buena forma de obtener una lista de todos los sockets de red que usa la JVM actual.

¿Hay alguna forma de obtener de una JVM la lista de todos los sockets de cliente y servidor, similar a netstat? Estoy usandoNetty conOIO (es decir.java.net.ServerSocket yjava.net.Socket) en Java 7. La solución debe funcionar tanto en Windows como en Linux.

Mi primera preferencia sería pedirlo a la JVM usando Java puro. Intenté buscar un Bean MX o similar, pero no encontré ninguno.

Otra opción podría ser conectarse a las API de creación de perfiles / depuración de JVM y solicitar todas las instancias de Socket y ServerSocket, pero no sé cómo hacerlo y si se puede hacer sin el código nativo (AFAIK,JVMTI es nativo solamente). Además, no debería hacer que las pruebas sean lentas (incluso mi prueba de extremo a extremo más lenta es solo de 0,5 segundos, lo que incluye iniciar otro proceso de JVM).

Si la interrogación de la JVM no funciona, una tercera opción sería crear un diseño que rastree todos los sockets a medida que se crean. Esto tiene la desventaja de tener la posibilidad de perder algún lugar donde se crean los enchufes. Ya que estoy usando Netty, parece implementable envolviéndoloChannelFactory y usando unGrupo de canales.

Respuestas a la pregunta(2)

Su respuesta a la pregunta