Выяснение, какие сетевые сокеты открыты в текущей Java VM

Я пишу сквозной тест на то, что моя Java-программа высвобождает все свои ресурсы - потоки, серверные сокеты, клиентские сокеты. Это библиотека, поэтому освобождение ресурсов путем выхода из JVM не вариант.Тестирование освобождения потоков было легко, потому что вы можете спроситьThreadGroup для всех потоков в нем, но я еще не нашел хороший способ получить список всех сетевых сокетов, которые использует текущая JVM.

Is there some way to get from a JVM the list of all client and server sockets, similar to netstat? Я используюНетти сOIO (Т.е.java.net.ServerSocket а такжеjava.net.Socket) на Java 7. Решение должно работать как в Windows, так и в Linux.

Моим первым предпочтением было бы спросить это у JVM, использующей чистую Java. Я пытался найти MX Bean или подобное, но не нашел ни одного.

Другой вариант может состоять в том, чтобы подключиться к API профилирования / отладки JVM и запросить все экземпляры Socket и ServerSocket, но я не знаю, как это сделать и можно ли это сделать без встроенного кода (AFAIK,JVMTI только для родного). Кроме того, это не должно замедлять тесты (даже мой самый медленный сквозной тест составляет всего 0,5 секунды, что включает запуск другого процесса JVM).

Если опрос JVM не работает, третьим вариантом будет создание дизайна, который отслеживает все сокеты по мере их создания. Это имеет недостаток, заключающийся в возможности пропустить какое-то место, где создаются сокеты. Поскольку я использую Netty, кажется, что это реализуемоChannelFactory и используягруппу каналов.

Ответы на вопрос(2)

Ваш ответ на вопрос