Я собираюсь использовать кеш SoftReference (довольно простая вещь сама по себе). Тем не менее, я столкнулся с проблемой при написании теста для него.
Цель теста - проверить, запрашивает ли кеш предыдущий кешированный объект с сервера после очистки памяти.
Здесь я нахожу проблему, как заставить систему выпускать мягкие ссылочные объекты. Вызов System.gc() недостаточно, потому что мягкие ссылки не будут выпущены до тех пор, пока память не станет низкой. Я запускаю этот unit test на ПК, поэтому бюджет памяти для виртуальной машины может быть довольно большим.
================== Добавлено позже ======================================================================= ===
Спасибо всем, кто позаботился ответить!
После рассмотрения всех pro и contra я решил пойти грубым способом, как советовали nanda и jarnbjo. Однако оказалось, что JVM не настолько тупой - он даже не попытается собрать сбор мусора, если вы попросите блок, который один больше, чем бюджет памяти VM. Поэтому я изменил код следующим образом:
/* Force releasing SoftReferences */
try {
final List<long[]> memhog = new LinkedList<long[]>();
while(true) {
memhog.add(new long[102400]);
}
}
catch(final OutOfMemoryError e) {
/* At this point all SoftReferences have been released - GUARANTEED. */
}
/* continue the test here */