gpt4 book ai didi

java - 图像被缓存并耗尽了我的堆空间

转载 作者:搜寻专家 更新时间:2023-10-31 20:15:43 25 4
gpt4 key购买 nike

这个问题是为我的 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 的帮助。

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

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

请注意,创建 Image 对象只是为了获取图像的宽度/高度,这在稍后的某些逻辑中是必需的。

有没有办法禁用 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

提交

最佳答案

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

A memory-sensitive implementation of the Map interface.

A SoftCache object uses java.lang.ref.SoftReference 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 方法的一部分,您还可以将图像设置为 null 或重构,以便它尽快超出范围。

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

关于java - 图像被缓存并耗尽了我的堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5245864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com