Как говорят другие, используйте профилировщик, чтобы найти что потребляет память.
Если вы еще не знаете, сборщик мусора может освободить память только для объектов, находящихся вне области видимости. То есть на них нет никаких ссылок. Просто убедитесь, что он выходит за рамки, когда вы сделали с ним. Похоже, что вы заблокировали его таким образом, где на него все еще ссылаются.
Кроме того, если вы хотите предложить GC очистку, попробуйте следующее:
System.gc ();
System.runFinalization ();
Опять же, это всего лишь предложение для gc; но я обнаружил, что это действительно помогает, если вы запустите после , многие объекты выйдут из области видимости.
Наконец, вы можете настроить аргументы vm.
Есть настройки для минимального / максимального размера кучи. Если это критическое приложение, установите его на то же самое и установите его высоким (таким образом, он не должен продолжать выделять / освобождать - он просто захватывает один большой кусок при запуске). Это не исправление, просто обходной путь.