Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“内存不足”;在处理大量图像时_Java_Processing - Fatal编程技术网

Java &引用;“内存不足”;在处理大量图像时

Java &引用;“内存不足”;在处理大量图像时,java,processing,Java,Processing,我正在尝试运行一个草图,它应该在coverflow动画中显示图像(png,大小在100kb到1,5mb之间,总共55.4mb)。它可以处理大约10幅图像,但如果使用更多的图像,就会出现内存不足错误。我正在将图像文件名加载到字符串数组中,如下所示: String[] names = {"00.jpg", "01.jpg", "02.jpg"}; 然后它们被加载到草图中,如下所示: covers = new Cover[names.length]; for (int i = 0; i <

我正在尝试运行一个草图,它应该在coverflow动画中显示图像(png,大小在100kb到1,5mb之间,总共55.4mb)。它可以处理大约10幅图像,但如果使用更多的图像,就会出现内存不足错误。我正在将图像文件名加载到字符串数组中,如下所示:

String[] names = {"00.jpg", "01.jpg", "02.jpg"};
然后它们被加载到草图中,如下所示:

covers = new Cover[names.length];
  for (int i = 0; i < covers.length; i++ ) {
  covers[i] = new Cover(names[i]);
}
initCovers();
当我运行草图时,我的ram(8gb)在几秒钟内就被填满了,草图甚至没有加载,它只是崩溃了。当我用大约10幅图像开始绘制草图时,一切正常(大约1.5gb的内存使用)

我的问题是:为什么它使用了这么多内存?这正常吗?是否有办法使其运行更高效(例如,释放当前未显示图像的内存,因为我们在屏幕上一次只能看到大约3个图像)

编辑:我认为问题在于,在cover类中,每次调用它时,都会创建一个新的PImage。这可能吗


内存中的图像大小:宽度*高度*(颜色深度/8),因此对于我的图像(1575y1969,24位),将是8,9mb。times 91映像:仅用于映像的内存使用量约为807mb。

尝试增加JVM堆空间

java -Xmx1024m
(是的,我知道,1gig有点“过量”,但经过一些实验后,这个值可以降低)


正如@millimoose所说,Java加载的图像在加载时会解压缩到内存中,因此,即使磁盘上100kb的小图像在解压缩时也会突然占用mb的RAM。当你开始处理alpha通道时,它会变得更加复杂。

我想说,试着用一个临时盖作为手柄将它们绘制到一个组件上,而不是让N个多的对象挂在周围?如果您需要在绘图时间后与图像进行交互,只需保留一些有关其绘图位置和尺寸的简单元数据,然后使用单击事件x、y等来查找给定的图像以允许您使用它。

压缩图像的大小并不能很好地指导内存需求

以像素为单位的大小更好。例如,一张分辨率为800万像素的现代相机照片需要至少32mb的内存来表示。如果你用swing处理这个尺寸的图像,至少是这个尺寸的两倍或三倍。很容易就把大量的内存消耗掉了


另外,Java的内部内存管理在处理这种大小的块方面也不是很好。

既然我更好地理解了用例,我建议改变整个方法


您尝试模拟的图像类型(如上图所示)不会在应用程序启动后立即加载全部图像。介绍。取而代之的是,他们阅读一小群他们将首先呈现给用户的图像。当用户接近该组的末尾时,软件会在序列开始时刷新一些图像(如果内存不足),并在序列结束时加载更多图像。

不要忘记PNG是压缩的。当您将它们加载到可以直接渲染的图像中时,它们将被解压缩到原始位图中。也许只保留当前显示的未压缩内容就足够了,而将其他内容以压缩形式保留在内存中以避免I/O。听起来像是某个地方的bug。你确定你没有一次又一次地加载相同的图像吗?然后我建议进行分析@millimoose-我怀疑png解压缩是否能从55MB扩展到1.5GB。这将是一个96%的压缩率。(我把JPG误读为PNG,但这一点是适用的,如果不是更适用的话。)@TedHopp JPG在167kb的磁盘上,在1.39mb的内存中,PNG在157kb的磁盘上,在6.37mb的内存中-这是没有alpha通道的-为什么文本说PNG,而代码使用JPG?它是哪一个?内存中的图像大小:宽度*高度*(颜色深度/8),因此对于我的图像(1575y1969,24位),它将是8,9mb。Times91图像:仅用于图像的内存使用量约为807mb。我已经将用于处理的ram增加到2gb。不知道如何将java cmd行选项与处理结合使用。@Kris:您真的需要将所有这些图像同时存储在内存中吗?它们真的需要这么大吗?它们是否以全分辨率显示?如果没有,则将其缩小。@Kris另外,您可能希望确保颜色模型与您的屏幕设备兼容。根据,1GB实际上可能是默认值。(不确定,文档没有明确提到运行客户机VM的服务器类机器的情况。)插件扩展,我们已经开始朝着正确的方向发展,由于时间限制,这并不是一个真正的选择,而且似乎没有明显的内存泄漏,我想我们必须缩小可以显示的图像数量/质量。
java -Xmx1024m