Finden Sie heraus, welche Netzwerk-Sockets in der aktuellen Java-VM geöffnet sind

Ich schreibe einen End-to-End-Test, in dem mein Java-Programm alle seine Ressourcen freigibt - Threads, Server-Sockets, Client-Sockets. Da es sich um eine Bibliothek handelt, ist es nicht möglich, Ressourcen durch Beenden der JVM freizugeben.Testen der Freigabe von Threads war einfach, weil man einen fragen kannThreadGroup Für alle Threads darin, aber ich habe noch keine gute Möglichkeit gefunden, eine Liste aller von der aktuellen JVM verwendeten Netzwerk-Sockets abzurufen.

Gibt es eine Möglichkeit, von einer JVM die Liste aller Client- und Server-Sockets abzurufen, ähnlich wie bei netstat? Ich benutzeNetty mitOIO (d. h.java.net.ServerSocket undjava.net.Socket) unter Java 7. Die Lösung muss sowohl unter Windows als auch unter Linux funktionieren.

Meine erste Präferenz wäre, es von der JVM mit reinem Java zu fragen. Ich habe versucht, eine MX Bean oder ähnliches zu finden, aber keine gefunden.

Eine andere Möglichkeit besteht darin, eine Verbindung zu den Profilerstellungs- / Debugging-APIs der JVM herzustellen und nach allen Instanzen von Socket und ServerSocket zu fragen. Ich weiß jedoch nicht, wie und ob dies ohne systemeigenen Code (AFAIK,JVMTI ist nur einheimisch). Außerdem sollten die Tests dadurch nicht langsamer werden (selbst mein langsamster End-to-End-Test dauert nur 0,5 Sekunden, einschließlich des Starts eines weiteren JVM-Prozesses).

Wenn das Abfragen der JVM nicht funktioniert, besteht eine dritte Option darin, ein Design zu erstellen, das alle Sockets nachverfolgt, während sie erstellt werden. Dies hat den Nachteil, dass die Möglichkeit besteht, dass eine Stelle fehlt, an der Sockets erstellt werden. Da ich Netty verwende, scheint es durch Wrapping umsetzbar zu seinChannelFactory und mit aChannelGroup.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage