Descobrir quais soquetes de rede estão abertos na Java VM atual

Eu estou escrevendo um teste end-to-end que meu programa Java libera todos os seus recursos - threads, soquetes de servidor, soquetes de cliente. É uma biblioteca, portanto liberar recursos saindo da JVM não é uma opção.Testando a liberação de threads foi fácil, porque você pode pedir umThreadGroup para todos os encadeamentos, mas ainda não encontrei uma boa maneira de obter uma lista de todos os sockets de rede que a JVM atual está usando.

Existe alguma maneira de obter de uma JVM a lista de todos os soquetes do cliente e do servidor, semelhante ao netstat? estou a usarNetty comOIO (isto éjava.net.ServerSocket ejava.net.Socket) no Java 7. A solução precisa funcionar tanto no Windows quanto no Linux.

Minha primeira preferência seria perguntar a partir da JVM usando Java puro. Tentei procurar um MX Bean ou similar, mas não encontrei nenhum.

Outra opção pode ser conectar-se às APIs de perfil / depuração da JVM e solicitar todas as instâncias de Socket e ServerSocket, mas não sei como fazer isso e se isso pode ser feito sem código nativo (AFAIK,JVMTI é nativo somente). Além disso, ele não deve tornar os testes lentos (até mesmo meu teste de ponta a ponta mais lento é de apenas 0,5 segundo, o que inclui iniciar outro processo da JVM).

Se a interrogação da JVM não funcionar, uma terceira opção seria criar um design que rastreie todos os sockets à medida que eles são criados. Isso tem a desvantagem de ter a possibilidade de perder algum lugar onde os soquetes são criados. Desde que eu estou usando o Netty, parece implementável por envolvimentoChannelFactory e usando umChannelGroup.

questionAnswers(2)

yourAnswerToTheQuestion