gpt4 book ai didi

java - 使用 BufferedImage 加载图像时内存使用率较高

转载 作者:行者123 更新时间:2023-12-02 09:37:06 28 4
gpt4 key购买 nike

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

我的问题是:

  1. 当我运行程序时 - RAM 使用量约为 50mb
  2. 正在加载 1mb JPG 文件 - RAM 使用量 ~93mb
  3. 保存 1mb JPG 文件 - RAM 使用量约 160mb

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

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

下面是加载和保存图片的代码,完整代码,你可以找到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()

最佳答案

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

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

另一个值得阅读的问题是Why is it bad practice to call System.gc()?

关于java - 使用 BufferedImage 加载图像时内存使用率较高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57410510/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com