Я собираюсь использовать кеш на основе SoftReference (само по себе довольно простая вещь). Однако при написании теста я столкнулся с проблемой.
Цель теста - проверить, запрашивает ли кэш ранее кэшированный объект у сервера снова после того, как происходит очистка памяти.
Здесь я обнаружил проблему, как заставить систему освобождать мягкие ссылочные объекты. Вызова System.gc () недостаточно, потому что мягкие ссылки не будут освобождены до тех пор, пока память не станет низкой. Я запускаю этот модульный тест на ПК, поэтому бюджет памяти для виртуальной машины может быть довольно большим.
================== Добавлено позже ===== =========================
Спасибо всем, кто постарался ответить!
Рассмотрев все за и против, я решил использовать метод грубой силы, как советуют nanda и jarnbjo . Оказалось, однако, что JVM не так уж и глупа - победила ' Не пытайтесь даже выполнить сборку мусора, если вы запрашиваете блок, который сам по себе превышает бюджет памяти виртуальной машины. Поэтому я изменил код следующим образом:
/* 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 */