Я пытался изучить различные исключения в Java и столкнулся с OutOfMemoryError, и я хотел видеть его в работе, таким образом, я записал следующую программу для создания бесконечных объектов путем создания их в бесконечном цикле. Программа входит в бесконечный цикл, это не выдает исключение OutOfMemoryError.
class Test {
public static void main(String...args) {
while(true) {
Integer i = new Integer();
}
}
}
Вы на правильном пути. Единственное, чего вам не хватает, так это концепции сборки мусора. Программа действительно создает бесконечные объекты 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.
}
}
}
В этой программе целочисленные объекты создаются бесконечно, как и раньше, но теперь я добавляю их к вектору, поэтому убедитесь, что есть способ добраться до них, и они не становятся пригодными для сборки мусора.
-121--3460641-Тип данных int представляет собой 32-разрядное целое дополнение со знаком 2. Он имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647
Вы находитесь справа трек. Единственное, чего вам не хватает - это понятия сбора мусора. Программа создает бесконечные целочисленные объекты, но после 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
, так как она больше не используется.
попробуйте с чем-то вроде a
List l = new ArrayList();
int i = 0;
while(true) { l.add(i++); }
Самый простой способ получить исключение 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]; } }
Переменная 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);
}
}
}