Непосредственно не отвечая на ваш вопрос, но, как уже сказано в комментариях freeMemory считает свободную память, а не память, которая будет доступна после GC, таким образом, если вы вызываете freeMemory просто перед запуском GC вы можете подумать, что достигли своего предела «пониженного давления», но у вас также может быть достаточно свободной памяти после следующего запуска GC.
Другой подход может заключаться в создании легко достижимого объекта и проверке, был ли он заявлен ГК:
что-то вроде:
SoftReference<Object> sr = new SoftReference<Object>(new Object(),new ReferenceQueue<Object>());
public boolean underPressure(){
if (sr.isEnqueued()) {
// recreate object to monitor
sr = new SoftReference<Object>(new Object(),new ReferenceQueue<Object>());
return true;
}
return false;
}