我的應用程序出現問題,並且縮小了一點。我的記憶似乎有未使用的物體。然而,當我在Netbeans IDE的Profiler中按下「收集垃圾」時,GC並沒有收集它們(即使程序本質上沒有空閒,即使沒有處理線程處於活動狀態也不會收集它們) 。Java GC未收集某個對象
我發現負責臨時使用的存儲器的高量的代碼:
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的內存。
爲什麼會發生這種行爲,我將如何解決它?
avgColor做什麼? – arynaq
@arynaq通過從列表中返回一個「顏色」來給出所有顏色的平均值。 –
skiwi
簡單的治療方法是避免首先存儲所有顏色。當你只需要平均值時,就可以實時計算它。 – Henry