gpt4 book ai didi

Java GC 不收集某些对象

转载 作者:行者123 更新时间:2023-11-30 09:16:38 25 4
gpt4 key购买 nike

我的申请有问题,已缩小范围。我的内存中似乎有未使用的对象。

然而,奇怪的是,GC 不收集它们(即使在程序基本上空闲时也不收集,即没有 Activity 的处理线程),但是当我在 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 的内存。

为什么会发生这种行为,我该如何解决?

最佳答案

GC 不会在任何时候强制收集内存,只有当您需要分配内存并且您的 VM 没有足够的资源时才会这样做。您可以通过这种方式减少占用空间:

private Integer getWhiteLines(BufferedImage image) {
Integer whiteLines = 0;
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);
}

Color avgColor = avgColor(colors);
if (isWhite(avgColor)) {
whiteLines++;
}
}

return whiteLines;
}

关于Java GC 不收集某些对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19360109/

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