Я хочу кэшировать данные, созданные моим приложением, в памяти, но если памяти становится мало, я хотел бы обменять данные на диск.
В идеале я хотел бы, чтобы виртуальная машина уведомила меня, что ей требуется памятьи записать мои данные на диск и освободить память таким образом.Но я не вижу способа подключиться к виртуальной машине таким образом, чтобы уведомить меня до того, как и OutOfMemoryError
произойдет где-то (скорее всего, в коде, никак не связанном с кешем).
Справочные классы в java.lang.ref
, по-видимому, не имеют никакого смысла в этом случае, их механизм уведомления (ReferenceQueue
) срабатывает только после того, как ссылка уже была восстановлена GC.Тогда было бы слишком поздно сохранять данные на диск.
Какие альтернативы доступны для эффективного управления кучей памяти?(не переключайтесь на диск до тех пор, пока это не станет абсолютно неизбежным)
Edit1 : в ответ на комментарий «ОС уже делает это для вас» - это касается только части проблемы -объем памяти, который ОС может выделить , является ограниченным ресурсом .Существуют и другие ограничения, помимо объема памяти, доступной для ОС, которые необходимо учитывать здесь:
- Ограничение, налагаемое архитектурой виртуальной машины (
32-Bit VM
) - Ограничениепамяти, которая может быть выделена для процесса виртуальной машины (
32-Bit OS
) - Ограничение, возможно, наложенное на виртуальную машину с использованием опции
-Xmx
Просто запуск виртуальной машины с неограниченной кучейРазмер не помешает ему исчерпать память, даже если ОС все еще имеет много свободного места, он может быть недоступен для ВМ по вышеуказанным причинам.