使用缓冲图像加载图像时内存使用率高



我创建了一个程序,该程序使用FileDialog加载图像,调整其大小,将其预览给用户,然后单击按钮后将其保存到文件夹中。

我的问题是:

  1. 当我运行我的程序时 - RAM 使用率 ~50mb
  2. 加载 1MB JPG 文件 - 内存使用率 ~93MB
  3. 保存 1mb JPG 文件 - 内存使用率 ~160MB

我打算这个程序是轻量级的,但在 3-4 个文件之后,它占用了 500mb 的 RAM 空间。

我尝试在每次用户保存文件时使用System.gc();,但它仅将 RAM 使用量减少了 ~10%。

下面是一个加载和保存图像的代码,完整的代码,你可以在这里找到。

顺便说一句 - 为什么在加载 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()

"问题"是ImageIO占用了大量内存。然后这个内存将不会返回到操作系统(这就是为什么即使是不需要调用System.gc()也不会返回它(,因为这就是 JVM 的工作方式。(Java 13 承诺内存将返回给操作系统?正如@Andrew Thompson在评论部分指出的那样,如果你想要更少的内存消耗,看看这个问题。如果您运行它,您将看到在内存限制下它不会消耗太多。这实际上告诉你不要担心它。JVM将发挥其魔力,并根据操作系统说的可用内存量来处理内存消耗。

如果它仍然困扰您,您可以尝试找到任何可能表现不同的ImageIO替代方案。不过在我看来,它不值得满足您的需求。我的意思是,您只想保存/加载图像。

另一个值得一读的问题是为什么调用System.gc((是一种不好的做法?

最新更新