垃圾收集器在 java 中不工作?

Garbage collector not working in java?

我有一个非常简单的程序,可以将屏幕截图保存到 ArrayList - 例如,我拍了 100 张屏幕截图,将它们添加到列表中,然后清除列表。像这样:

public static void main(String[] args) {
    JFrame frame = new JFrame(); // creating simple JFrame
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    List<BufferedImage> list = new ArrayList<>();
    for (int i = 1; i <= 100; i++) {
        BufferedImage capture = makeScreenShot();
        list.add(capture);
        System.out.println("capture saved to arraylist " + i);
    }
    list.clear();
}

和 makeScreenShot 方法:

private static BufferedImage makeScreenShot() {
    Robot robot = null;
    try {
        robot = new Robot();
    } catch (AWTException e) {
        e.printStackTrace();
    }
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Rectangle screenBounds = new Rectangle(toolkit.getScreenSize());
    BufferedImage capture = robot.createScreenCapture(screenBounds);
    return capture;
}

如果我 运行 这个简单的程序,我的任务管理器 (Windows) 显示这个程序使用大约 1GB 的 RAM。为什么 Java 垃圾收集器不从 RAM 内存中删除所有 BufferedImages?没有对这些 BufferedImages 的引用,我说的对吗?

我同意durron597,这个问题已经有了答案。 而且,正如他还所说,你不能给程序少于完成屏幕捕获、处理和列表清除的循环所需的内存。

accepted answer 中所述,JVM 将使用尽可能多的内存,这没关系

您的程序会在某个时候稳定其内存使用,而且很可能 运行 永远稳定。我确实尝试过,实际上(虽然不是永远)。

但我喜欢测试的较小堆大小版本 - 这就是我的设置方式:

这是之后使用的内存量:

并且运行持续了 6 个小时(拍摄了将近 70 万张屏幕截图!):

所以,如果您确实需要,您仍然可以限制它的内存使用量——但是您必须这样做吗?

来自javadocs"Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse."

因此,System.gc() 只是一个建议 - 可能是 really bad one