Если вы используете сервер, то ServerSocket - правильное решение. Он будет управлять всем лучше, чем вы, делая это вручную, используя утилизацию и множество других оптимизаций, предназначенных для запуска сервера с Java.
Закрытие сокета отключает объект Java от операционной системы, что означает, что он не занимает никаких ресурсов вне JVM, поэтому это действительно не должно быть проблемой. Но если минимальные накладные расходы от схемы сборки / завершения сборки Java слишком велики, то Java не является правильным решением (поскольку ваша проблема больше не относится к программированию сокетов). Хотя я должен сказать, что эффективный сборщик мусора не намного хуже, чем явное управление памятью (и на самом деле может работать лучше).