Есть ли какой-нибудь хороший способ определить, какие именно потоки открывают эти сокеты?
Не потоки как таковые .
Один из подходовзапустить приложение с помощью профилировщика.Это может найти проблему, даже если вы не можете точно воспроизвести проблему клиента.(@SyBer сообщает, что профилировщик YourKit имеет специальную поддержку для обнаружения утечек сокетов ... см. Комментарий.)
Второй подход - настроить тестовую платформу, используя ulimit
для REDUCE.разрешено количество открытых файлов.Это может упростить воспроизведение сценария «слишком много открытых файлов» в вашей тестовой среде.
Наконец, я бы порекомендовал «очистить» вашу кодовую базу, чтобы найти все места, где создаются объекты сокетов.Затем проверьте их все, чтобы убедиться, что они правильно используют блоки try / finally, чтобы убедиться, что сокеты всегда закрыты.