我试图研究Java中的不同异常,并遇到了OutOfMemoryError,我想在工作中看到它,因此我编写了以下程序,通过在无限循环中创建无限对象来创建无限对象。该程序会进入无限循环,不会引发OutOfMemoryError异常。

class Test {
    public static void main(String...args) {
        while(true) {
            Integer i = new Integer();
        }
    }
}

最佳答案

您走在正确的轨道上。您唯一缺少的是垃圾收集的概念。该程序实际上确实创建了无限个Integer对象,但是在第一个迭代之后,在前一个迭代中创建的对象就可以使用GC。

考虑一下:

Integer i;
i = new Integer(); // 1. create new object and make reference variable i refer to it.
i = new Integer(); // 2. create another object and make reference variable i refer to it...there is no way to get to the object created in step1 so obj in step 1 is eligible for GC.

如果要查看OutOfMemoryError,则需要确保有一种方法可以访问在无限循环中创建的对象。因此,您可以执行以下操作:
class Test {
 public static void main(String...args) {
  Vector v = new Vector(); // create a new vector.
  while(true) {
   v.addElement(new Integer(1)); // create a new Integer and add it to vector.
  }
 }
}

在此程序中,像以前一样无限创建Integer对象,但是现在我将它们添加到 vector 中,因此请确保有一种方法可以访问它们,并且它们不符合GC的条件。

关于Java OutOfMemoryError不抛出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2261465/

10-10 17:08