Losted: верно, gc() все лишь "совет". обновил ответ, если Вас интересует конкретный ответ на вопрос "как освободить" - то никак. Лучший вариант Thread.setDaemon(true), но демоны не всегда подходят. Да и этот вариант не гарантирует того, что в следующей версии jvm другой GC не будет считать по-другому.
uxname: добавил пример в ответ, не принимайте за эталон, это просто пример, чтобы Вы поняли в каком направлении смотреть. Если хотите реальный боевой пример из работающего продакшена - велком на гитхаб искать.
"возможно переходят в состояние WAIT или SLEEP." чтобы исключить слово "возможно" - посмотрите через профайлер. Возможно Вы ищите проблему совсем не там.
Существует десятки и сотни способов поставить приложение клиенту на сервер. Это зависит от сервера приложение (если он вообще используется, потому что может быть простой легковесный jar, у которого все есть внутри), от технологий которые используются, например, если клиент использует докер, то это будет просто image. "zero downtime и миграции бд" - тут тоже множество вариантов, как один из вариантов - осуществляем deploy на каждый node поочередно, отключая из продакшена и включая обратно, в базе тоже немало вариантов и т.д. и т.п. Ваш вопрос очень широкий, в общем как и разнообразие технологий и подходов в java
mystdeim: maven ничего не перезапускает, он нужен для сборки артефакта. Очевидно Владимир имел ввиду, что он заходит на сервер по ssh и руками подкладывает свежий артефакт. Wildfly/jboss/tomcat etc видит новый файл war/ear etc и разворачивает приложение
parkito: Вот читайте внимательно доку https://docs.oracle.com/javase/tutorial/jmx/mbeans... As defined by the JMX specification, a getter is any public method that does not return void and whose name begins with get. A getter enables a manager to read the value of the attribute, whose type is that of the returned object. A setter is any public method that takes a single parameter and whose name begins with set