我正在使用 Java (Eclipse) 构建一个处理照片的应用程序。
所以我使用了这个链接Java get available memory了解我还有多少可用内存。问题是我有这个代码:
Main.printMemory("before image");
url = new File(information.getPath()).toURI().toURL();
image = ImageIO.read(url);
Main.printMemory("after image");
结果是:
Message: before image
Free memory (bytes): 82554768
Maximum memory (bytes): 129957888
Total memory (bytes): 85000192
和
Message: after image
Free memory (bytes): 42600680
Maximum memory (bytes): 129957888
Total memory (bytes): 85000192
因此加载该图像需要 82554768 - 42600680 = 39954088 字节 = 38 MB
照片大小为3.3 MB
占用这么多内存正常吗???为什么会消耗这么多内存呢?有什么方法可以减少这种情况,希望保持照片质量吗?
最佳答案
压缩和编码图像的文件大小对于存储图像的内存要求来说是一个不好的指标。主内存中的图像通常是未压缩的,因为使用压缩编码会使图像操作变得更加复杂并且速度更慢。
您有一个4,000 x 3,000
JPEG 图像。由于源是 JPEG 编码的,因此可能会通过 ImageIO
加载。与 TYPE_INT_RGB
意味着每个像素都需要 4
字节( int
)的存储空间。这意味着解码后的图像将用完所需的 4,000 x 3,000 x 4 = 48,000,000
字节内存。当 Java 支持 16 位颜色深度时,这个数字甚至可能更大。
它只需要~ 38MB,听起来好像图像没有完全解压( TYPE_INT_RGB
),但实际上在主内存中以某种打包编码表示(例如 TYPE_3BYTE_BGR
需要 36 MB)。
图像很大。
关于java - 内存中的图像消耗的内存远多于其文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175736/