Здравствуйте!
Есть проблема.
Программа работает с изображениями (отрисовка + минимум редактирования)
Изображения местами ощутимо большие: пятимегабайтный jpeg после распаковки весит точно больше 20 мегов. И всё это в опреативной памяти.
Применил ehcache с настройками
<cache name="images"
maxElementsInMemory="0"
maxElementsOnDisk="100000"
eternal="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"
/>
То есть, в памяти вообще ничего не должно быть (maxElementsInMemory="0").
Однако в дебаггере в elementsOnDisk элементов на один меньше, чем надо. Есть подозрения, что последний элемент в памяти.
Также возникла идея (возможно, это не очень красиво) отводить сразу некоторого размера int[] под изображение и читать его туда без лишних выделений памяти. Потому что сейчас из кэша читается int[], потом из него создаётся Image
MemoryImageSource mis = new MemoryImageSource(width, height, pixels,
0, width);
Toolkit tk = Toolkit.getDefaultToolkit();
return tk.createImage(mis);
(уже два куска памяти размером с изображение)
При этом garbageCollector работает в последний момент и расход памяти выходит за рамки 100 мб (для маленького настольного клиента это много)
Что вообще делать в такой ситуации? И как это всё вообще оптимизировать?
Спасибо за любые предложения