Почему вы думаете, что распределение кучи не правильно? Использование любого инструмента операционной системы, показывающего только 400 м, не означает, что оно не выделено.
Я не совсем понимаю, что вы ищете. 400м и выше уже проблема, или ваша программа должна так сильно нуждаться? Если вам действительно нужно иметь дело с таким большим количеством памяти, и вам кажется, что вам нужно много объектов, вы можете сделать несколько вещей:
Если потребление памяти не соответствует вашему инстинктивному ощущению, это правильное количество, чем вы, вероятно, теряете память. Это объясняет, почему он «замедляется» со временем. Возможно, вы пропустили удаление объектов из одной структуры, чтобы они не собирали мусор и замедляли поиск и тому подобное.
Ваши настройки памяти могут быть проблемой сами по себе. Сборка мусора не запускается сама по себе. Он вызывается только если достигнут некоторый порог. Если вы зададите для этого параметра большую кучу, а в вашей операционной системе будет достаточно памяти, сборка мусора будет выполняться не часто.
Упомянутые вами характеристики будут сценарием, в котором создается много объектов, и вскоре после этого они снова удаляются. В противном случае сборка мусора не будет проблемой (своего рода поколения GC). Это означает, что у вас есть только «молодые» объекты. Рассмотрите возможность использования пула объектов, если вам нужны объекты только в течение короткого периода времени. Это вообще исключило бы сборку мусора.
Если вы знаете, что в вашем коде хорошие времена для запуска gc, вы можете запустить его вручную, чтобы увидеть, если он что-то изменит. Это то, что вам нужно
Runtime r = Runtime.getRuntime();
r.gc();
Это только для целей отладки. Большую часть времени gc делает отличную работу, поэтому не нужно вызывать gc самостоятельно.