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