微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 图像被缓存并吃掉我的堆空间

这个问题是我为previous question提供的答案的结果.

我被要求使用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的帮助.

下面是创建Image对象的代码(内部使用SunToolkit.imgCache)

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

Plz注意,仅创建Image对象以获取图像的宽度/高度,稍后在某些逻辑中需要该宽度/高度.

有没有办法禁用SunToolkit图像缓存?更好的是,有没有办法清除这个缓存?或者有更好的方法可以检索这些信息吗?

BTW供您参考,我使用下面的命令来运行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 

萨米特

最佳答案
图像缓存似乎是由名为SoftCache的类实现的,其文档说明如下:

A memory-sensitive implementation of the Map interface.

A SoftCache object uses 07001
to implement a memory-sensitive hash map. If the garbage
collector determines at a certain point in time that a value object in a
SoftCache entry is no longer strongly reachable,then it may
remove that entry in order to release the memory occupied by the value
object. All SoftCache objects are guaranteed to be completely
cleared before the virtual machine will throw an
OutOfMemoryError.

所以我不担心这个缓存占用的内存,因为当其他地方需要内存时它会被自动清除.

编辑:在SyntaxT3rr0r阅读评论后,我认为在图像上调用flush仍然是值得的.如果这是一个larget方法的一部分,你也可以将image设置为null或重构,以便它更快地超出范围.

另一种可能性是尝试使用ImageIO Api检索宽度和高度.这应该可以通过获得ImageReader for the image type来实现.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?