JVM, о которой интервьюеры любят спрашивать

задняя часть JVM
JVM, о которой интервьюеры любят спрашивать

предисловие

По мере того, как Аба становилась все более и более смелой в интервью, в последние несколько дней у нее было еще одно интервью, на этот раз интервьюер попросил ее рассказать о своем понимании JVM.

Иди домой и жди уведомления

Интервьюер:Вы понимаете модель памяти JVM? Можете ли вы рассказать мне подробности?

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

Согласно «Спецификации виртуальной машины JAVA SE 7 Edition», память, управляемая виртуальной машиной JAVA, будет включать следующие области данных времени выполнения: куча, область методов, стек виртуальной машины, локальный стек методов и счетчик программ.

Интервьюер:Можете ли вы дать мне обзор этих областей?

Аба Аба:Область метода в основном хранит информацию о классе, константы и статические переменные, загружаемые виртуальной машиной. Область кучи в основном хранит объекты. Стек виртуальной машины используется для хранения кадров стека, созданных при выполнении метода. Локальный стек методов используется для хранения Счетчик программ используется для хранения адреса модуля, в котором находится следующая инструкция для кадра стека, сгенерированного при выполнении собственного метода.

Интервьюер:Итак, знаете ли вы, когда память стека переполняется?

Аба Аба:Ну, если глубина стека потока больше, чем максимальная глубина виртуальной машины, будет выброшено исключение StackOverflowError, что часто происходит при рекурсивных вызовах методов.

Интервьюер:Есть ли другая ситуация, когда происходит переполнение памяти стека?

Аба Аба:Вроде больше ничего нет...

Интервьюер:Можете ли вы рассказать о генерации кучи?

Аба Аба:Куча в основном делится на поколение, которое делится на новое поколение, старое поколение и постоянное поколение.

Аба Аба:Новое поколение в основном хранит некоторые объекты, которые живут и умирают, старое поколение хранит относительно стабильные объекты или большие объекты, а постоянное поколение используется для хранения статических файлов, таких как классы и методы Java.

Интервьюер:Ладно, на сегодняшнем интервью все, ты возвращайся первым и жди уведомления. 😈

Аба Аба:В ПОРЯДКЕ.

Примите предложение на месте

Аба Аба:Вы понимаете модель памяти JVM? Можете ли вы рассказать мне подробности?

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

Согласно «Спецификации виртуальной машины JAVA SE 7 Edition», память, управляемая виртуальной машиной JAVA, будет включать следующие области данных времени выполнения: куча, область методов, стек виртуальной машины, локальный стек методов и счетчик программ.

Интервьюер:Можете ли вы дать мне обзор этих областей?

Аба Аба:Область метода в основном хранит информацию о классе, константы и статические переменные, загружаемые виртуальной машиной. Область кучи в основном хранит объекты. Стек виртуальной машины используется для хранения кадров стека, созданных при выполнении метода. Локальный стек методов используется для хранения Счетчик программ используется для хранения адреса модуля, в котором находится следующая инструкция для кадра стека, сгенерированного при выполнении собственного метода.

Интервьюер:Итак, знаете ли вы, когда память стека переполняется?

Аба Аба:Возможны два случая, первый случай: если глубина стека потока больше максимальной глубины виртуальной машины, будет выброшено исключение StackOverflowError, что часто происходит при вызовах рекурсивных методов. Есть и другая ситуация: если потоки создаются непрерывно, каждый поток будет занимать определенное количество места, что приведет к нехватке места в стеке и исключению OOM. В этих областях JVM исключение OOM может возникнуть в куче, области методов, локальном стеке методов и стеке виртуальной машины. И счетчик программ — единственная область, которая не генерирует OOM.

Интервьюер:Хорошо, давайте поговорим о распределении кучи!

Аба Аба:Куча в основном делится на новое поколение, старое поколение и постоянное поколение.Этому постоянному поколению была выделена память кучи в версии JDK1.8.метапространствоВместо этого метапространство больше не находится в JVM, и используется локальная память.

Аба Аба:Новое поколение в основном хранит некоторые объекты, которые живут и умирают, старое поколение хранит относительно стабильные объекты или большие объекты, а постоянное поколение используется для хранения статических файлов, таких как классы и методы Java.

Аба Аба:Раздел нового поколения.

Аба Аба:Новое поколение делится на область Эдема и область выжившего, а область выжившего далее делится на две области (s0 и s1), и их соотношение составляет 8:1:1, как показано на рисунке. Новые объекты будут размещены в области Эдема в первую очередь.Если это большой объект, он сразу войдет в старость.Когда в области Эдема произойдет GC, уцелевшие объекты будут перемещены в область выживания.Когда возраст объекты в области Survivor достигают установленного значения. При достижении порога (по умолчанию 15) он будет перемещен в область старого поколения после его достижения.

Интервьюер:Какие области являются общими для потоков, а какие — частными для потоков?

Аба Аба:Область методов и область кучи совместно используются потоками, а три области стека виртуальной машины, локального стека методов и счетчика программ являются частными для потоков.

Интервьюер:Поскольку куча является общей, при создании нового объекта пространство памяти в куче может конкурировать между несколькими потоками.Как JVM обеспечивает потокобезопасность в этой области?

Аба Аба:Что ж, JVM использует для этого два метода: один использует коллизию указателей, то есть CAS конкурирует за место в памяти, а JVM также поддерживает список свободных мест для быстрого поиска свободной памяти. В то же время JVM также будет использовать TLAB, Thread Local Allocation Buffer, то есть метод локального выделения областей буфера потока.Часть памяти в области Eden делается приватной для потока.При появлении нового объекта необходимо создать, эта часть личного пространства потока используется для выделения его объекту.Это снижает дополнительные накладные расходы из-за конкуренции.

Интервьюер:Объекты размещены в куче?

Аба Аба:Большинство объектов размещается в куче, но есть особые случаи, когда объекты могут размещаться в стеке.Если вы хотите разместить объекты в стеке, вам необходимо выполнить анализ побега.

Аба Аба:Основное поведение escape-анализа заключается в анализе области действия объекта.После того как объект определен в методе, если на объект ссылаются вне метода или к нему могут получить доступ другие потоки, то говорят, что объект был экранирован.

Аба Аба:Если определено, что объект не убежит из метода, мы можем выделить память этого объекта в стек, тогда пространство памяти этого объекта может меняться с жизненным циклом кадра стека, создаваться и умирать вместе, Это может уменьшить нагрузку на кучу, повысить производительность сборщика мусора и, таким образом, повысить эффективность работы программы.

Аба Аба:Однако анализ побега не включен по умолчанию, потому что анализ побега требует большого количества вычислений в области действия объекта, чтобы определить, будет ли объект экранирован, и этот расчет повлияет на производительность, поэтому реализация выделения стека более сложна. , как правило, не используется. Пользователи могут использовать параметр -XX : +DoEsapeAnalysis, чтобы вручную включить анализ побега.

Интервьюер:Знакомы ли вы с гарантией распределения внутреннего пространства?

Интервьюер:Гарантия распределения пространства обычно возникает во время Minor GC. После Minor GC подходящие объекты будут переданы в старое поколение. Если максимально доступное непрерывное пространство в старом поколении больше, чем общее пространство, занимаемое всеми объектами в новом генерации, то этот второстепенный GC будет считаться безопасным, если меньше, то JVM проверит, допускает ли параметр HandlePromotionFailure конфигурации HandlePromotionFailure гарантированные сбои. Если HandlePromotionFailure=true, он будет продолжать проверять, превышает ли максимальное доступное непрерывное пространство в старом поколении средний размер объектов, переведенных в старое поколение.Если он больше, попробуйте дополнительный сборщик мусора, но этот дополнительный сборщик мусора все еще рискованно; если оно меньше или HandlePromotionFailure=false, вместо этого будет выполняться полный сборщик мусора.

Интервьюер:Вы узнали об алгоритмах GC и сборщиках мусора?

Аба Аба:Да, алгоритмы GC в основном делятся на следующие категории (Диди Ди... В это время у интервьюера зазвонил телефон)Интервьюер:Почему бы тебе не сделать это сегодня, интервью пройдено, приходи завтра во второй раз~

Аба Аба:В ПОРЯДКЕ.

Суммировать

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

Микроавтобус отправился в путешествие, связанное с JVM, поэтому она пошла домой и каждый день восполняла свои знания о JVM.

❤️/Спасибо за поддержку/

Выше приведено все содержание этого обмена, я надеюсь, что это поможет вам ^_^

Если вам понравилось, не забудьте поделиться, поставить лайк и добавить в избранное~

Добро пожаловать в публичный аккаунтавтобус программиста, три брата из Byte, Shopee и Zhaoyin, делятся опытом программирования, техническими галантерейными товарами и планированием карьеры, чтобы помочь вам избежать окольных путей, чтобы попасть на большую фабрику.