Esta pregunta es el resultado de las respuestas que se me proporcionaron para mi previous question.Imágenes que se almacenan en la memoria caché y se comen mi Heap Space
Me pidieron que use Eclipse MAT para investigar lo que está consumiendo mi montón. A continuación son mis observaciones (Top Consumidores):
class sun.awt.SunToolkit 333.7 MB
com.tennisearth.service.impl.CacheManagerServiceImpl 136 MB
org.apache.jasper.servlet.JspServlet 91.5 MB
ya he solucionado el problema con CacheManageServiceImpl
, pero requieren ayuda con SunToolkit
.
A continuación se muestra el código que crea un objeto de imagen (que utiliza internamente SunToolkit.imgCache
)
Image img = new ImageIcon(imagePath).getImage();
int imageWidth = img.getWidth(null);
int imageHeight = img.getHeight(null);
nota del PLZ que el objeto de imagen única se está creando para obtener el ancho/altura de la imagen que se requiere más adelante en algo de lógica.
¿Hay alguna manera de deshabilitar el almacenamiento en memoria caché de imágenes SunToolkit
? Mejor aún, ¿hay alguna manera de borrar este caché? ¿O hay una mejor manera de recuperar esta información?
cierto para su referencia, estoy usando el comando siguiente para ejecutar JBoss (nota del PLZ los argumentos Tamaño de pila):
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
hay un montón * de problemas en Java relacionados con las imágenes y el almacenamiento en caché de imágenes. Me viene a la mente el infame * flush() * solución alternativa alrededor de los defectos de API. Anular imágenes no siempre es suficiente: a veces necesitas llamar a * flush() * y simplemente no tiene sentido. Si está en un servidor, obtendría esa información de ancho/alto al ejecutar externamente el comando * identify * de ImageMagick. Es un poco doloroso ejecutar un proceso externo, pero luego cargar una imagen solo para obtener su ancho/alto en un servidor también es bastante pesado. – SyntaxT3rr0r
otra opción ... Estábamos procesando por lotes todas nuestras imágenes y colocando la información de ancho/alto directamente en el nombre de archivo de la imagen: * mypic.jpg * se convierte en * mypic640x480.jpg *. Luego simplemente extrajimos el (w, h) del nombre de archivo ... – SyntaxT3rr0r
si desea buscar en Google sobre este tema, aquí hay una cita interesante: * Hemos visto el problema de la descarga en otras plataformas aparte de OS X, así que creo que " Sun debe implementar la corrección adecuada, implementando finalizar en ToolkitImage para forzar una descarga antes de que GC recupere la imagen. ¿Alguien ha informado esto a Sun? * – SyntaxT3rr0r