Java Infinte循环在列表中添加元素不会给出OOME,为什么

Java Infinte循环在列表中添加元素不会给出OOME,为什么,java,out-of-memory,Java,Out Of Memory,我试过使用下面的infinte循环代码 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.o

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

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错误,而且堆大小保持在50MB到100MB之间?可能您有足够的ram供garbace collector执行其工作。在将任何东西打印到屏幕之前,尝试通过添加更多的项目使其变得更大。显示消息的速度非常慢,因此您将等待很长时间

...

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());
        }    
    }

...

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

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

无法重现。。。我在主线程java.lang.OutOfMemoryError中遇到异常:这里是java堆空间@JarrodRoberson同意这些都是小物体,但我不明白它们为什么是一样的。根据我每次的理解,一个新的Intger对象被添加到List@Naroji:从技术上讲,每次都会向列表中添加一个新的Long。@Naroji:是的,每次迭代都会添加一个新的Long。但是在每次迭代中打印到控制台需要花费很多时间。删除System.out.println行,您可能会更快地看到OOME。您忘记声明iI没有,这只是对原始代码的更改,其中我是一个静态类变量,正如您所说:可能您有足够的ram供garbace collector执行其工作,但我的问题是,当整数对象不断添加到列表中时,意思是说它们有强引用,那么GC如何收集和销毁这些从列表中引用的整数对象呢?它不会销毁整数对象事实上,这里没有整数对象,有引用长对象,乘以百万次,它会销毁JVM分配的其他变量。例如,为System.out.println命令生成了几十个时态字符串,我猜还有更多奇怪的数据。这是您在查找分配的内存时观察到的结果。所有这些变量都不是从代码中引用的,所以一旦需要为列表中的新引用留出空间,GC就会清理它们。一旦用完这些对象,它就会抛出OOME。@lejlot:no。每次调用i++时,它都会用另一个新的对象替换静态长对象。
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