Java OutOfMemoryError, не бросающий

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

class Test {
    public static void main(String...args) {
        while(true) {
            Integer i = new Integer();
        }
    }
}
7
задан Cœur 6 September 2018 в 07:18
поделиться

5 ответов

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

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

12
ответ дан 6 December 2019 в 10:49
поделиться

Типы данных Java

Тип данных int представляет собой 32-разрядное целое дополнение со знаком 2. Он имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647

-121--3460641-

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

Если вы хотите увидеть OutOfMemureError, вам нужно убедиться, что есть способ добраться до объектов, созданных в бесконечном цикле. Так что вы можете сделать что-то вроде:

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 право.

-121--3842562-

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

3
ответ дан 6 December 2019 в 10:49
поделиться

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

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

0
ответ дан 6 December 2019 в 10:49
поделиться

Самый простой способ получить исключение 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];
    }
}
2
ответ дан 6 December 2019 в 10:49
поделиться

Переменная 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);
        }

    }

}
1
ответ дан 6 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: