【问题标题】:Needed RAM to display images in java在java中显示图像需要RAM
【发布时间】:2013-06-19 04:48:40
【问题描述】:

另一个概念问题.. 我正在与 java 堆空间异常作斗争。 我的问题是,我必须渲染/显示小但很多的图像。 我超过了最大 ram。 (编辑 vm 选项没有帮助)但是我将所有图像存储在一个列表中。 我想如果我一张一张渲染图像并将其临时存储在本地硬盘上,它是否可能需要更少的内存。 如果显示在屏幕上,图像是否仍然全部在内存中?

代码中的更改会很重要,所以我想在此之前问一下..

【问题讨论】:

  • 只加载那些活跃在屏幕上的图像,保留图像来源的列表,并在需要时加载您需要的图像。确保你完全阻止那些你没有阻止的图像,以便 GC 可以释放内存
  • 好的,所以我将更改程序以将图像存储在磁盘上.. thx。 .滚动窗格可以完成这项工作吗? (只加载显示的内容)? jscrollpane api 没有直接回答这个问题.. 但是“可滚动客户端”的措辞让我期待它这样做..
  • 是和不是。加载图像后,它们主要保留在内存中。没有简单的方法可以知道您的组件何时消失
  • 我发现这里看起来很有用。:stackoverflow.com/questions/13627783/… 我明天会检查它。谢谢

标签: java image swing ram


【解决方案1】:

如果您的用例是 JScrollPane 内的 JList/JTable 中有很多图像/图标,我曾经为 CMS 搜索结果显示写过类似的内容:

我将较大图像的缩略图存储在服务器上/缓存在磁盘上。您可以利用 JList/JTable(或一般的 Swing 组件)只会尝试绘制屏幕上可见的组件这一事实,因此您不需要自己跟踪这一点。我在列表中使用了带有 ImageIcon 的 JLabel 作为渲染器,并在内存中使用了固定大小的图标缓存。每当渲染器遇到不在缓存中的图像时,我使用延迟加载技术并立即返回占位符图标,同时使用 SwingWorker 在后台加载图标。加载后,SwingWorker 向 JList 发出重绘。该图标现在将在缓存中,并且列表会很好地绘制。

一些额外提示:确保您的图标缓存大于屏幕上可以显示的最大项目数。此外,为您的 SwingWorkers 使用有限(固定大小)的线程池(可能一次加载多个图标),以避免可能导致闪烁的过度重新绘制循环。

【讨论】:

  • +1 用于从缓存中进行享元渲染;更多here.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2022-11-16
  • 1970-01-01
  • 2012-06-03
  • 2012-01-27
相关资源
最近更新 更多