我的申请有问题,并缩小了一点。我的记忆中似乎有未使用的对象。
然而奇怪的是,GC 并没有收集它们(即使在程序基本上处于空闲状态时也没有,即没有处理线程处于活动状态),但是当我在 Netbeans IDE 的 Profiler 中按“收集垃圾”时,它确实收集了。
我找到了负责暂时使用大量内存的代码:
private Integer getWhiteLines(BufferedImage image) {
Map<Integer, List<Color>> heightColors = new HashMap<>();
for (int h = 0; h < image.getHeight(); h++) {
List<Color> colors = new ArrayList<>();
for (int w = 0; w < image.getWidth(); w++) {
int colorRGBA = image.getRGB(w, h);
Color color = new Color(colorRGBA, true);
colors.add(color);
}
heightColors.put(h, colors);
}
Integer whiteLines = 0;
for (Map.Entry<Integer, List<Color>> entry : heightColors.entrySet()) {
Color avgColor = avgColor(entry.getValue());
if (isWhite(avgColor)) {
whiteLines++;
}
}
return whiteLines;
}
它列出了图像(以前是 PDF 文件)中每个像素的颜色。
这个问题也相当大,例如在某些 PDF 中,Color
对象会占用 14MB 的内存。
为什么会发生这种行为,我将如何解决它?