- Да, это работа программиста.
- Да, утечка памяти может вызвать это. Проблема в том, что если сокет не был закрыт в явном виде, он закрывается только тогда, когда экземпляр Socket или другого производного класса будет удален . Это выполняется сборщиком мусора автоматически, однако он не уничтожит экземпляр класса, если где-то останется хотя бы одна ссылка (утечка памяти).
Может быть довольно сложно выяснить, что хранит ссылки на экземпляры и вызывает утечку памяти. Это могут быть потоки, которые все еще работают и хранят ссылки в своих локальных переменных. Это может быть какой-то массив, который используется для отслеживания всех соединений. Возможностей много, и все они зависят от реализации.