Java 内存中的图像消耗的内存远大于其文件大小

Java 内存中的图像消耗的内存远大于其文件大小,java,image,memory,memory-management,Java,Image,Memory,Memory Management,我正在使用Java(Eclipse)构建一个可以处理照片的应用程序 所以我使用这个链接来了解我还有多少可用内存。问题是我有以下代码: Main.printMemory("before image"); url = new File(information.getPath()).toURI().toURL(); image = ImageIO.read(url); Main.printMemory("after image"); 结果是: 消息:在图像之前释放内存(字节):82554768 最大

我正在使用Java(Eclipse)构建一个可以处理照片的应用程序

所以我使用这个链接来了解我还有多少可用内存。问题是我有以下代码:

Main.printMemory("before image");
url = new File(information.getPath()).toURI().toURL();
image = ImageIO.read(url);
Main.printMemory("after image");
结果是:

消息:在图像之前
释放内存(字节):82554768
最大内存(字节):129957888
总内存(字节): 85000192

消息:映像后可用内存(字节):42600680
最大值 内存(字节):129957888
总内存(字节):85000192

因此加载该映像需要
82554768-42600680=39954088字节=38MB

照片大小为3.3MB

占用这么多内存正常吗???为什么它会消耗这么多内存?有没有什么办法可以减少这一点,希望能保持照片质量?

压缩和编码图像的文件大小对于存储图像的内存需求来说是一个不好的指标。主内存中的图像通常是未压缩的,因为使用压缩编码会使图像操作更复杂,速度也慢得多

您有一个
4000 x 3000
JPEG图像。由于源是JPEG编码的,它可能通过
ImageIO
TYPE\u INT\u RGB
加载,这意味着每个像素需要
4
字节(一个
INT
)的存储空间。这意味着解码图像将使用多达4000 x 3000 x 4=48000000字节的内存。当Java获得对16位颜色深度的支持时,这个数字可能会更大

它只需要约38MB,这听起来像是图像没有完全解压(
TYPE\u INT\u RGB
),而是在主内存中以某种压缩编码(例如
TYPE\u 3BYTE\u BGR
需要36MB)表示


图像很大。

这很正常,是的。原因是大多数图像格式都是以某种方式压缩的——例如gif、jpeg和png都是如此——但BufferedReader不是。也就是说,它独立地记录每个像素的数据,而不尝试压缩或合并这些信息。这会产生更大的内存占用:宽度x高度x(每像素字节数)。如果最后一个是4字节,你可以看到图片是如何快速变大的


若你们想处理图像,你们并没有什么办法——旋转它们,然后过滤,等等。这就是为什么照片编辑工具总是占用大量内存的原因!如果您不需要全分辨率,可以使用类似或其他库的方法对图像进行降采样。

图像有多大,以像素为单位?4000 × 3000及其JPEG图像4000 x 3000 x 3字节/像素=36000000字节。(图像未压缩存储在内存中)我刚刚加载了5张照片,全部大小约为2-4MB,可用内存为82554872至42839376至31523760至54946760至43621704至6062136至18054976