Sprawdzanie, które gniazda sieciowe są otwarte w bieżącej maszynie wirtualnej Java

Piszę test end-to-end, że mój program Java wypuszcza wszystkie swoje zasoby - wątki, gniazda serwera, gniazda klienta. To biblioteka, więc zwolnienie zasobów przez wyjście z JVM nie jest opcją.Testowanie zwalniania wątków było łatwe, ponieważ możesz zapytaćThreadGroup dla wszystkich wątków w nim zawartych, ale nie znalazłem jeszcze dobrego sposobu na uzyskanie listy wszystkich gniazd sieciowych używanych przez bieżącą maszynę JVM.

Czy jest jakiś sposób, aby uzyskać z JVM listę wszystkich gniazd klienta i serwera, podobnych do netstat? używamNetty zOIO (to znaczy.java.net.ServerSocket ijava.net.Socket) na Javie 7. Rozwiązanie musi działać zarówno w systemie Windows, jak i Linux.

Moja pierwsza preferencja polegałaby na zapytaniu z JVM przy użyciu czystej Javy. Próbowałem poszukać fasoli MX lub podobnej, ale nie znalazłem żadnego.

Inną opcją może być połączenie się z profilującymi / debugującymi API JVM i poproszenie o wszystkie wystąpienia Socket i ServerSocket, ale nie wiem, jak to zrobić i czy można to zrobić bez kodu natywnego (AFAIK,JVMTI jest tylko rodzimym). Ponadto nie powinno to spowalniać testów (nawet mój najwolniejszy test end-to-end wynosi zaledwie 0,5 sekundy, co obejmuje rozpoczęcie kolejnego procesu JVM).

Jeśli odpytywanie JVM nie działa, trzecią opcją byłoby stworzenie projektu, który śledzi wszystkie gniazda podczas ich tworzenia. Ma to wadę polegającą na możliwości pominięcia miejsca, w którym tworzone są gniazda. Ponieważ używam Netty, wydaje się możliwe do wdrożenia przez zawijanieChannelFactory i używając aChannelGroup.

questionAnswers(2)

yourAnswerToTheQuestion