Постоянный кэш диска в ehcache 3.4 использует (утечка?) Прямую память
Я запускаю веб-приложение, которое использует Ehcache 3.4.0. У меня есть конфигурация кэша, которая определяет простое значение по умолчанию 1000 объектов в памяти:
<cache-template name="default">
<key-type>java.lang.Object</key-type>
<value-type>java.lang.Object</value-type>
<heap unit="entries">1000</heap>
</cache-template>
Затем у меня есть несколько дисковых кешей, которые используют этот шаблон по умолчанию, но переопределяют все значения (сгенерированные программно, поэтому они вообще используют шаблон по умолчанию) следующим образом:
<cache alias='runViewCache' uses-template='default'>
<key-type>java.lang.String</key-type>
<value-type>java.lang.String</value-type>
<resources>
<heap unit='entries'>1</heap>
<disk unit='GB' persistent='true'>1</disk>
</resources>
</cache>
Поскольку данные записываются в мой дисковый кэш, JVM использует прямую / вне кучи память и никогда не освобождается. Даже очистка кеша не освобождает память. Используемая память напрямую связана (насколько я могу судить, почти побайтно) с данными, записанными в дисковый кэш.
Полномочный уровень для этого кэша является экземпляром org.ehcache.impl.internal.store.disk.OffHeapDiskStore.
Кажется, это утечка памяти (память используется и никогда не освобождается), но я ни в коем случае не эксперт по настройке ehcache. Может кто-нибудь предложить изменение конфигурации, которое заставит мой уровень диска НЕ использовать память вне кучи? Или есть что-то еще, что я просто совершенно не понимаю, на что может указать кто-то еще?
Спасибо!
1 ответ
Как вы измеряете "б"?
TL; DR Нет, уровень диска не тратит память RAM.
Начиная с версии 3.0.0 Ehcache использует файлы, отображенные в памяти, для сохранения диска:
Замена порта хранилища дисков Ehcache 2.x с открытым исходным кодом на тот, который использует библиотеку offheap и отображенные в память файлы.
Это означает, что Ehcache использует адресное пространство в памяти для доступа к файлам на диске. Это действительно потребляет 0 байтов вашей оперативной памяти. (По крайней мере, напрямую. Как уже говорилось @louis-jacomet, ОС может решить кэшировать части файлов в оперативной памяти.)
Когда вы работаете в Linux, вы должны сравнить значения VIRT и RES вашего процесса. VIRT - это количество виртуальных байтов, используемых процессом. RES - это количество байтов реальной памяти (RESident), используемых процессом. VIRT должен увеличиться, пока кеш дискового хранилища заполнен, но RES должен оставаться довольно стабильным.