【问题标题】:How to free memory allocated by ImageIcon? I have a infinite loop with "new ImageIcon" and i need free each image after display.如何释放 ImageIcon 分配的内存?我有一个带有“new ImageIcon”的无限循环,我需要在显示后释放每个图像。
【发布时间】:2012-12-15 02:10:30
【问题描述】:

如何释放 ImageIcon 分配的内存?我有一个带有“new ImageIcon ...”的无限循环,我需要在屏幕上显示每个图像后释放它分配的内存。图像之间的显示间隔为 200 毫秒。有没有人有一个简单有效的解决方案来避免不断增长的内存消耗?非常感谢!

【问题讨论】:

  • 你能分享你的代码 sn-p 吗?
  • 我无限次调用这个函数: public void setImagem(String Imagem) { if (Imagem != null) { imagem = new ImageIcon(Imagem).getImage(); } 其他 { imagem = null; } 重绘(); }
  • “有没有人有一个简单有效的解决方案来避免内存消耗越来越大?”忽略它。 JVM 会在需要时进行 GC。

标签: java swing memory memory-management imageicon


【解决方案1】:

如果你不重用图片,想丢弃系统缓存的数据,看看ImageIcon#getImage#flush

刷新此 Image 对象正在使用的所有可重构资源。 这包括为渲染到 屏幕以及用于存储的任何系统资源 如果可以重新创建图像的数据或像素。图像是 重置为类似于首次创建时的状态,以便如果它是 再次渲染,必须重新创建或获取图像数据 再次从它的源头。

【讨论】:

  • 我尝试了您的建议,但没有成功。内存继续增加每个“新 ImageIcon”。我认为(我很无知,无意冒犯)“刷新”只处理待处理的操作,而不是“ImageIcon”分配的空闲内存(也许我错了)。你还有另一张“魔法卡”要展示吗?非常感谢!
  • flush 基本上会允许ImageIcon 之前分配的资源,它们可能会在将来的某个时间用于垃圾分配。
  • 非常感谢 MadProgrammer!每次使用“新 ImageIcon”时,我都会刷新。祝您有愉快的一天!
【解决方案2】:

在图像的最终绘制之后,说images.get(i) 删除持有的图像:images.set(i, null)。这样垃圾收集器就可以将其移除。

【讨论】:

  • 我会尝试每个答案。非常感谢大家,非常感谢您的快速支持。
  • 我尝试使用它,但由于我的无知,无法成功。当我输入“Images.get (i); Images.set (i, null)”时,解释器 NetBeans 期望更多,输入“设置什么,还是得到什么?”而且,正如我所说,我很无知,不知道对解释器说什么,将我的代码与正确的功能联系起来。你能帮助我吗?代码为:public void set picture(Picture String) { if (Image! = null) { image = new ImageIcon (Picture).获取图像();否则 {} 图像 = null; } 重绘(); }
  • 对不起,我是这里的无知;写完之后,你扩展了你的问题。我假设您将创建的图像保存在类字段中,并在 paint(Component) 方法中绘制下一个图像。对于图像,唯一的内存泄漏要么是一个引用,要么是createGraphics,没有dispose。对不起,也许你做一个add(new JLabel(imageicon)) 太ininetely?这会导致问题。
  • 我正在尝试创建一个桌面应用程序(java swing),我发现它使用“外观”、静态图像、降级或其他东西非常烦人。所以我创建了一些动画,类似于动画 gif,但在我的例子中是 20 张 1024x640 jpg 的图像序列(每种形式),我正在创建动画壁纸之类的形式。这就是问题所在——如何释放上面的图像来分配一个新的图像序列而不使用越来越多的内存?
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2014-11-10
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多