#java
Я знаю, что ссылки на объекты создаются в памяти стека а сами объекты в куче. В коде ниже я пытаюсь переполнить кучу создавая большое количество объектов Main(), используя зацикленность в конструкторе, и вместо outOfMemoryError получаю stackOverflow. public class Main { public Main() { new Main(); } public static void main(String[] args) { new Main(); } } Почему? Как мне переполнить кучу?
Ответы
Ответ 1
На каждый вызов функции в памяти выделяется кусок стека. В нём хранятся адрес возврата в вызывающую функцию, локальные ссылки, примитивные переменные и, возможно, другая служебная информация. При выходе из функции стек очищается. Но из-за рекурсии вы не выходите из функции, пока не перестанете вызывать функцию саму из себя. Соответственно, размер стека стремительно растёт и возникает его переполнение. Чтобы добиться ошибки OutOfMemoryError, объекты должны занимать в памяти слишком много места. Обычно эта ошибка возникает либо из-за выделения слишком большого куска памяти (например, огромный массив) static int[] arr = new int[1000000000]; либо из-за утечек памяти. Как правило, размер стека намного меньше размера кучи. Если размер стека обычно измеряют мегабайтами или десятками мегабайт, то размер кучи может достигать сотен мегабайт или нескольких гигабайт. Именно поэтому, у вас программа падает с ошибкой StackOverflowError.
Комментариев нет:
Отправить комментарий