Неограниченный DiskWriteThreadPool вызывает утечку памяти в Ehcache - PullRequest
0 голосов
/ 16 января 2020

Я очень быстро записываю большой объем данных в 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, чтобы не замедлять кеширование.

...