Я думаю, вам нужно лучше понять, какие объекты создаются, а какие остаются в памяти. Инструмент профилировщика может помочь вам - многие из них позволяют вам сделать снимок памяти, выполнить некоторые операции, а затем сравнить текущее состояние со снимком. Это подчеркивает возможные утечки памяти.
Кроме того, убедитесь, что вы явно запустили сборщик мусора, прежде чем даже смотреть на состояние памяти - в противном случае вы можете увидеть множество объектов, которые на самом деле не ссылаются и будут собраны следующим GC.
Я бы не стал беспокоиться о ресурсах, выделенных JVM. Пока вы освобождаете все ресурсы, которые вы выделяете, у вас все будет хорошо - и профилировщик поможет вам убедиться, что вы действительно освободите их все.