1

Тема: Heap & Stack Java

Я знаю, що посилання на об'єкти створюються в пам'яті стека а самі об'єкти в хіп. У коді нижче я намагаюся переповнити хіп створюючи велику кількість об'єктів Main (), використовуючи зацикленість в конструкторі, і замість outOfMemoryError отримую stackOverflow.

public class Main {
     public Main () {
         new Main ();
     }

     public static void main (String [] args) {
         new Main ();
     }
}

Чому? Як мені переповнити хіп?

2

Re: Heap & Stack Java

Зазвичай кажуть "вичерпати". Додайте в клас Main масив на кілька мегабайт.
Просто стек, зазвичай, значно менший за купу; а кожен рекурсивний виклик кладе в стек місцеві змінні, параметри (this, наприклад) та адресу повернення. Тобто ви на кожні ~8 байт купи (4 байти інформаційної структури+4 байти об'єкту Main) кладете в стек ~8 байт посилань (на this та на точку повернення). Приблизно, бо я не знаю, скільки саме це займає в Java і які ще додаткові витрати там можливі. І стек, як менший, закінчується першим. А якщо на купі буде виділятися величезний масив, то стек не встигне закінчитися.

Подякували: capitaNemo, varkon, leofun013

3

Re: Heap & Stack Java

Все зрозумів, дякую)
Тільки адреси повернення у мене немає, я ж не написав Main main = new Main ();

4

Re: Heap & Stack Java

Коли ви створюєте об'єкт, викликається його конструктор. Конструктор - це функція із параметрами, тілом і, звісно, точкою повернення. Як і будь-яка інша функція.

5 Востаннє редагувалося P.Y. (14.03.2019 10:10:54)

Re: Heap & Stack Java

Можна спробувати вичерпати хіп, не навантажуючи стек, але для цього рекурсію слід замінити циклом.

public class HeapOverflow
{
HeapOverflow next;
public HeapOverflow()
    {
    this.next=null;
    }
public HeapOverflow(HeapOverflow next)
    {
    this.next=next;
    }
public static void main()
    {
    HeapOverflow ho=new HeapOverflow();
    for( ; ; )
        ho=new HeapOverflow(ho);
    }
}
Подякували: koala, varkon, leofun013