我的程序中有一种情况,我需要访问保存在硬盘上的一定数量的图像。我可以仅在我真正需要它们时才加载它们,或者在启动时就已经将它们全部加载。
出于好奇,我尝试从几个文件夹中读取所有(大约 11k)图像并将它们保存在几个列表中。我想知道这是否花费了太长时间,但在阅读了大约 9k 张图像后收到了 OutOfMemoryError。
我的 JRE 的堆大小为 1g (-Xmx1g)。
为什么我的代码会发生这种情况?我会产生内存泄漏吗?您有什么建议可以更改以不再遇到这种情况,或者解决方案只是在我需要文件时仅读取文件?所有文件的总大小只有 40mb 左右,所以我认为将它保存在我的内存中是可以的(40mb 似乎与我的 1g 堆大小相比并不算多)。或者,一旦加载,java 是否会执行一些疯狂的魔法,将文件大小乘以高数字?
我已经对 stackoverflow 进行了一些研究,但无法真正转换给定的答案(比如从这里或这里)。所以如果你们中的任何人有一个想法,我会很高兴:)
我的代码在这里,对不起,如果它有点难看 - 我只是在胡闹:
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class FatfontsManager {
private List<BufferedImage> until9;
private List<BufferedImage> until99;
private List<BufferedImage> until999;
private List<BufferedImage> until9999;
// loads and keeps all images
public FatfontsManager() {
until9 = new ArrayList<>();
until99 = new ArrayList<>();
until999 = new ArrayList<>();
until9999 = new ArrayList<>();
String absolutPathToThisProject = new java.io.File("")
.getAbsolutePath();
// load Images
for (int i = 1; i < 10; i++) {
until9.add(loadImage(absolutPathToThisProject
+ "\\latexDir\\0..9\\" + i + ".png"));
}
System.out.println("1 - 9 loaded");
for (int i = 1; i < 100; i++) {
until99.add(loadImage(absolutPathToThisProject
+ "\\latexDir\\0..99\\" + i + ".png"));
}
System.out.println("1 - 99 loaded");
for (int i = 1; i < 1000; i++) {
until999.add(loadImage(absolutPathToThisProject
+ "\\latexDir\\0..999\\" + i + ".png"));
}
System.out.println("1 - 999 loaded");
for (int i = 1; i < 10000; i++) {
until9999.add(loadImage(absolutPathToThisProject
+ "\\latexDir\\0..9999\\" + i + ".png"));
}
System.out.println("1 - 9999 loaded");
}
public static void main(String[] args) {
new FatfontsManager();
}
public static BufferedImage loadImage(String ref) {
BufferedImage bimg = null;
try {
bimg = ImageIO.read(new File(ref));
} catch (Exception e) {
System.err.println("Error loading image file " + ref);
e.printStackTrace();
}
return bimg;
}
}
非常感谢每一个答案。