Java OutOfMemoryError не выбрасывает - PullRequest
7 голосов
/ 14 февраля 2010

Я пытался изучить различные исключения в Java, натолкнулся на OutOfMemoryError и хотел увидеть его в работе, поэтому я написал следующую программу для создания бесконечных объектов, создавая их в бесконечном цикле. Программа работает в бесконечном цикле, она не выдает исключение OutOfMemoryError.

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

Ответы [ 5 ]

12 голосов
/ 14 февраля 2010

Вы на правильном пути. Единственное, чего вам не хватает, так это концепции сбора мусора. Программа действительно создает бесконечные целочисленные объекты, но после 1-й итерации объект, созданный на предыдущей итерации, становится пригодным для 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.
  }
 }
}

В этой программе целочисленные объекты создаются бесконечно, как и раньше, но теперь я добавляю их к вектору, чтобы убедиться, что есть способ добраться до них, и они не получают GC.

3 голосов
/ 14 февраля 2010

Ваша переменная i собирается после того, как вы нажмете OutOfMemoryError, так как она больше не используется.

2 голосов
/ 14 февраля 2010

Самый простой способ получить исключение OutOfMemoryException - создать массив, который не помещается в память:

public class TestOutOfMemoryException
{
    public static void main(String[] args)
    {
        final long maxMemory = Runtime.getRuntime().maxMemory();
        System.out.println(maxMemory);
        final byte[] boom = new byte[(int) maxMemory];
    }
}
1 голос
/ 14 февраля 2010

Переменная i ограничена только циклом, она не сохраняется после каждой итерации. Таким образом, происходит сборка мусора до того, как программе не хватит памяти. Попробуйте создать ArrayList перед входом в цикл и добавить в него каждый экземпляр i:

public class Test {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        while (true) {
            Integer i = new Integer();
            list.add(i);
        }

    }

}
0 голосов
/ 14 февраля 2010

попробуйте что-то вроде

List l = new ArrayList(); int i = 0; while(true) { l.add(i++); }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...