アプリケーションに問題があり、少し絞り込みました。私の記憶の中に未使用のオブジェクトがあるようです。
ただし、奇妙なことに、GC はそれらを収集しません (プログラムが本質的にアイドル状態の場合、つまり、アクティブな処理スレッドがない場合でも)、Netbeans IDE のプロファイラーで「ガベージの収集」を押すと、収集されます。
大量のメモリを一時的に使用する原因となっているコードを見つけました。
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 のメモリを占有することがあります。
なぜこの動作が発生し、どうすれば解決できますか?