Постоянный кэш диска в 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 должен оставаться довольно стабильным.

Другие вопросы по тегам