Я пишу сквозной тест, который моя Java-программа выпускает все свои ресурсы - потоки, серверные сокеты, клиентские сокеты. Это библиотека, поэтому освобождение ресурсов путем выхода из JVM не является вариантом. Тестирование освобождения потоков было легко, потому что вы можете задать ThreadGroup для всех потоков в нем, но я еще не нашел хороший способ получить список всех сетевых сокетов, которые использует текущая JVM.
Есть ли способ получить из JVM список всех клиентских и серверных сокетов, похожих на netstat? Я использую Netty с 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 и используя ChannelGroup.