Я очень быстро записываю большой объем данных в Ehcache 3.x, и у меня не хватает памяти. После долгих поисков и устранения неисправностей, профилирования и погружения в мусорные дампы я поняла, что источником утечки памяти являются массивы байтов, ожидающих записи на диск (в частности, Terracotta FileWriteTask
).
Копание через Исходный код, я был шокирован, обнаружив эту строку кода в org.ehcache.impl.internal.store.disk.DiskWriteThreadPool
:
writer = executionService.getOrderedExecutor(poolAlias, new LinkedBlockingQueue<>());
Это означает, что если программа записи asyn c не поспевает за путями кеша, задачи записи накапливаются в неограниченной очереди! Есть ли способ, через конфигурацию, ограничить этот параметр? В качестве обходного пути я скопировал этот класс в базу исходного кода, чтобы вместо него использовался мой класс, а в качестве емкости просто указывался жесткий код 100
. Это полностью устранило утечку, поскольку операции с кешем теперь блокируются, если устройство записи на диск слишком сильно отстает. Но, конечно, это не долгосрочное жизнеспособное решение. Любые идеи?
PS Я уже подробно исследовал CacheLoaderWriter
, потому что он имел maxQueueSize
и коалесценцию (что было бы здорово и для авторитетного записывающего диска), но это только для сохранения внешнего хранить в syn c, чтобы не замедлять кеширование.