Изображения кэшируются и поглощают мою кучу пространства - PullRequest
5 голосов
/ 09 марта 2011

Этот вопрос является результатом ответов, предоставленных мне на мой предыдущий вопрос .

Меня попросили использовать Eclipse MAT, чтобы исследовать, что съедает мою кучу.Ниже приведены мои наблюдения (основные потребители):

class sun.awt.SunToolkit                                 333.7 MB
com.tennisearth.service.impl.CacheManagerServiceImpl     136 MB
org.apache.jasper.servlet.JspServlet                     91.5 MB

Я уже исправил проблему с CacheManageServiceImpl, но мне нужна помощь с SunToolkit.

Ниже приведен код, который создаетОбъект изображения (который внутренне использует SunToolkit.imgCache)

Image img = new ImageIcon(imagePath).getImage();
int imageWidth = img.getWidth(null);
int imageHeight = img.getHeight(null);

Обратите внимание, что объект изображения создается только для того, чтобы получить ширину / высоту изображения, что требуется позже в некоторой логике.

Есть ли способ отключить SunToolkit кэширование изображений?А еще лучше, есть ли способ очистить этот кеш?Или есть лучший способ получить эту информацию?

Кстати, для справки, я использую приведенную ниже команду для запуска jboss (пожалуйста, обратите внимание на аргументы размера кучи):

java -Dprogram.name=run.sh -server -Xms256m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m -verbose:gc -Xloggc:/data1/logs/jboss/GC.log -XX:+HeapDumpOnOutOfMemoryError -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false -Djava.net.preferIPv4Stack=true -Djava.library.path=/usr/local/java/jboss-4.2.2.GA/bin/native -Djava.endorsed.dirs=/usr/local/java/jboss-4.2.2.GA/lib/endorsed -classpath /usr/local/java/jboss-4.2.2.GA/bin/run.jar:/usr/local/java/jdk1.6.0_06/lib/tools.jar org.jboss.Main -c default -b <IP_ADDRESS> -Djboss.messaging.ServerPeerID=1

Sumit

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Кажется, что кеш изображений реализован классом с именем SoftCache , его документация гласит следующее:

Чувствительная к памяти реализация интерфейса Map.

A SoftCache объект использует java.lang.ref.SoftReference реализовать чувствительную к памяти хэш-карту. Если мусор Коллектор определяет в определенный момент времени, что объект значения в SoftCache запись больше недоступна, тогда она может удалите эту запись, чтобы освободить память, занятую значением объект. Все SoftCache объекты гарантированно будут полностью очищено до того, как виртуальная машина сгенерирует OutOfMemoryError.

Так что я не буду беспокоиться о памяти, занятой этим кешем, так как он будет очищаться автоматически, когда память понадобится где-то еще.

Редактировать: После прочтения комментариев СинтаксисT3rr0r , я думаю, что все же стоило бы вызвать flush на изображении. Если это часть метода larget, вы также можете установить для изображения значение null или рефакторинг, чтобы он быстрее выходил из области видимости.

Другой возможностью было бы попробовать ImageIO Api для получения ширины и высоты. Это должно быть возможно, получив ImageReader для типа изображения .

1 голос
/ 09 марта 2011

Возможно ли, что ваш объект Image остается в области действия в течение длительных периодов времени? Например, если он содержится во внешней области блока кода, который выполняется в течение длительного периода времени, он может не собираться должным образом.

Иногда (в редких случаях) полезно явно указывать для ссылки на объект Image значение null. Это было бы верно в случае, о котором я упоминал выше. Для получения дополнительной информации см. Следующий вопрос: Влияет ли назначение объектов на null в Java на сборку мусора?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...