Как устроена память в JVM
Что проверяют
Знаете ли вы деление на области и понимаете ли, что где живёт. Дальше обычно идёт разговор про сборку мусора и OutOfMemoryError.
Как отвечать
Память делится на две большие части.
Общая для всех потоков. Куча, где живут все объекты и массивы; она разделена на молодое поколение (Eden и два Survivor) и старое. Metaspace, где лежат метаданные классов; с восьмой версии он вне кучи и растёт в нативной памяти. Пул строк, который с седьмой версии находится в куче.
Своя у каждого потока. Стек вызовов с кадрами методов, локальными переменными и ссылками; счётчик команд; стек нативных методов.
Как это связано со сборкой мусора: новые объекты попадают в Eden, пережившие сборку переезжают в Survivor, долгожители в старое поколение. Расчёт на то, что большинство объектов умирает молодыми, поэтому молодая сборка частая и дешёвая, а полная редкая и дорогая.
Ошибки, по которым узнают область: OutOfMemoryError: Java heap space это куча, обычно утечка через долгоживущую коллекцию; Metaspace это чаще всего динамическая генерация классов; StackOverflowError это стек и глубокая рекурсия; unable to create new native thread это нативная память.
Полезно назвать инструменты: -Xmx и -Xms, снимок кучи через jmap, разбор в VisualVM или Eclipse MAT, jstat для наблюдения за сборкой.
Где спотыкаются
Говорят про PermGen, не зная, что его нет с восьмой версии.
Считают, что примитивы всегда на стеке: поле объекта живёт в куче вместе с ним.
Не различают OutOfMemoryError в куче и в Metaspace, а лечатся они по-разному.
Не могут объяснить, зачем нужны два Survivor.