0

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

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

4

1 回答 1

1

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

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

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

于 2013-06-24T07:51:26.007 回答