【发布时间】:2019-08-08 10:28:35
【问题描述】:
我创建了一个程序,它使用 FileDialog 加载图像、调整大小、预览给用户,并在单击按钮后将其保存到文件夹中。
我的问题是:
- 当我运行我的程序时 - RAM 使用量 ~50mb
- 加载 1mb JPG 文件 - RAM 使用量 ~93mb
- 保存 1mb JPG 文件 - RAM 使用 ~160mb
我希望这个程序是轻量级的,但是在 3-4 个文件之后它会占用 500mb RAM 空间。
我尝试在每次用户保存文件时使用System.gc();,但它只减少了大约 10% 的 RAM 使用量。
下面是加载和保存图片的代码,完整代码,你可以找到HERE。
顺便说一句 - 为什么在加载 1mb JPG 然后将其保存到 10mb 之后?
图片加载代码:
FileDialog imageFinder = new FileDialog((Frame)null, "Select file to open:");
imageFinder.setFile("*.jpg; *.png; *.gif; *.jpeg");
imageFinder.setMode(FileDialog.LOAD);
imageFinder.setVisible(true);
userImagePath = new File(imageFinder.getDirectory()).getAbsolutePath()+"\\"+imageFinder.getFile();
userImagePath = userImagePath.replace("\\", "/");
图片保存代码:
BufferedImage bimage = new BufferedImage(userImage.getWidth(null), userImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(userImage, 0, 0, null);
bGr.dispose();
try {
BufferedImage bi = bimage;
File outputfile = new File("C:\\Users\\Mariola\\git\\MySQL-viwer\\MySQL viewer\\src\\database_images\\"+userBreedInfo[0]+".jpg");
ImageIO.write(bi, "png", outputfile);
} catch (IOException e1) {
}
}
System.gc()
【问题讨论】:
-
我不推荐空的 catch 块。至少记录异常。
-
您应该记住 jpg 是一种压缩图像格式。当它被解压缩成 BufferedImage 时,每个像素可能由 4 个整数值 (RGBA) 表示,具体取决于您的图像格式/颜色空间。这意味着一张 100x100 像素的图像占用了 40,000 个整数值。
-
ImageIO.write很可能是这里的罪魁祸首。这不一定是泄漏,JVM 可能只是不释放资源。你可以忘记System.gc(),这只是一个建议,并不可靠,并且广泛建议不要使用。 -
@Mär - 有没有更好的方法来保存图像并在之后释放资源?
-
“我希望这个程序是轻量级的,但是在 3-4 个文件之后它会占用 500mb RAM 空间。” 然后启动有限 RAM 的 JVM! JVM 仅在需要时才会进行 GC。见What is the XY problem?
标签: java swing bufferedimage ram