Если вы используете решение runtime / totalMemory, которое было опубликовано здесь во многих ответах (я много делал), сначала обязательно запустите две сборки мусора, если вы хотите довольно точные / согласованные результаты.
Для эффективности Java обычно позволяет мусору заполнить всю память перед принудительным сбором GC, и даже тогда это обычно не полный сборщик мусора, поэтому ваши результаты для runtime.freeMemory () всегда будут где-то между "реальным" количеством свободного память и 0.
Первый GC не получает всего, он получает большую часть.
Подъем в том, что если вы просто сделаете вызов freeMemory (), вы получите абсолютно бесполезный номер, который варьируется в широких пределах, но если сначала сделать 2 gc, это очень надежный индикатор. Это также делает процедуру НАМНОГО медленнее (возможно, в секундах).