1

我试过使用下面的无限循环代码

public class OOME_Collection {

    static List l = new ArrayList();
    static Long i= new Long(1) ;

    public static void main(String[] args) {
        while (true) {
            l.add(i);
            i++;
            System.out.println("size " + l.size());
        }

    }
}

最后一个 SOP 是:大小 3310522 为什么它没有给出 OOME 错误,而且堆大小保持在 50 MB 到 100 MB 之间变化

4

2 回答 2

0

可能你有足够的内存供垃圾收集器完成它的工作。在将任何内容打印到屏幕之前尝试通过添加更多项目来使其变得非常大(显示消息真的很慢,所以你会等待很长的时间等待 OOME)

...

public static void main(String[] args) {
        while (true) {
            for(int j=0;j<1000000;++j)
                l.add(i);
            i++;
            System.out.println("size " + l.size());
        }    
    }

...

这很好地抛出:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2245)
    at java.util.Arrays.copyOf(Arrays.java:2219)
    at java.util.ArrayList.grow(ArrayList.java:213)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)
    at java.util.ArrayList.add(ArrayList.java:411)
    at test.Test.main(OOME.java:26)
Java Result: 1
于 2013-08-10T17:32:05.110 回答
0

您的系统可能具有较高的处理能力和内存,因此 GC 正在努力回收空间,因为您可以看到内存消耗从 50 到 150MB 不等。

您可以形成添加 1000 个对象所花费的时间与计数的图表。然后您可能会定期在图表中看到一些异常,这可能会得出结论,在异常时间内 GC 正在努力回收空间。只是一个近似值。

于 2013-08-10T18:47:33.280 回答