Что то не собирает. Через сколько минут он соберет?
Это всё зависит от версии JRE, настроек GC и прочего. Можешь попробовать вызвать (System/runFinalization) для принудительного вызова финализаторов, но гарантий что он финализируется тебе никто не даст - его мог не пометить GC по какой-то причине и тогда он будет висеть открытым.
Да, после того как пропадут все ссылки не него. т.е. примерно так
(import java.net.DatagramSocket)
=> java.net.DatagramSocket
(DatagramSocket. 33222)
=> #object[java.net.DatagramSocket 0x445157b9 "java.net.DatagramSocket@445157b9"] ; Порт открылся - его видно в netstat
(System/gc)
=> nil ; Здесь сокет открыт потому что была ссылка в *1
(System/gc)
=> nil ; Здесь сокет ещё открыт потому что была ссылка в *2
(System/gc)
=> nil ; Здесь сокет ещё открыт потому что была ссылка в *3
(System/gc)
=> nil ; Здесь сокет закрылся, потому что ссылок на него не осталось