Собеседование со старшим java-инженером обязательно: обзор системы знаний jvm

интервью Java JVM алгоритм

Чтобы практиковать несравненные боевые искусства на арене, вы должны обладать как внутренними, так и внешними навыками, изысканными движениями и глубокими внутренними навыками.Основой боевых искусств являются внутренние навыки. Для людей с низкими боевыми искусствами (таких как Семь Дьяволов с юга реки Янцзы) ходы важнее, потому что они не могут полагаться на внутренние навыки, чтобы напрямую навредить людям, они могут полагаться только на ходы, и они могут побеждать. с лезвием на лезвие, но после практикующих мастеров важнее внутренние навыки. Человек с низкой внутренней силой не может победить человека с высокой внутренней силой даже в чудесах. Например, как бы ни было хорошо ваше фехтование, если вы колете мечом, а кто-то другой ломает ваш меч ладонью, как вы можете еще использовать свое фехтование? человек в порядке, но тебя шокирует.Раненый, как ты можешь драться. Точно так же они дополняют друг друга.После того, как внутренняя сила станет глубокой, сила первоначальных обычных движений будет умножена.

То же самое и у нас, занимающихся разработкой.Сейчас фреймворков становится все больше и больше, а инкапсуляция все совершеннее.Различные фреймворки справляются со всем, и почти не нужно обращать внимание на лежащую в их основе реализацию. Младшим программистам нужно знать только основные методы использования, можно быстро развиваться и выходить в интернет, а вот для старших программистов все большее значение имеет развитие внутренних навыков, таких как алгоритмы, паттерны проектирования, базовые принципы и т. д. Только после того, как вы овладеете этими основами, сможете ли вы узнать их в процессе разработки.Поэтому, когда возникает проблема, можно быстро определить суть проблемы.

Для Java-программистов Spring Family Bucket может справиться почти со всем, Spring Family Bucket — это тонкий ход, а JVM — очень важная часть внутренних навыков.В сети есть проблемы с производительностью, а настройка JVM — неизбежная проблема. Таким образом, важность базовых знаний JVM для старших программистов не требуется.Когда наша компания проводит собеседования со старшими разработчиками, знания, связанные с JVM, также должны быть одним из критериев оценки. В этой статье будут рассмотрены все точки проверки, на которые jvm необходимо обратить внимание, на основе статей серии jvm, написанных ранее.

общее расчесывание jvm

Система jvm обычно делится на четыре части:

  • механизм загрузки классов

  • структура памяти JVM

  • Алгоритм сборки мусора GC

  • Настройка команды анализа ГХ

Разумеется, эти пункты знаний были подробно представлены в предыдущих статьях, а здесь будут разобраны только основные.

Здесь рисуется интеллект-карта и отображаются все очки знаний, так как карта относительно большая, вы можете ответить в паблике"jvm" смотреть.

механизм загрузки классов

Основное внимание:

  • что такое загрузка класса

  • жизненный цикл класса

  • загрузчик классов

  • Модель родительского делегирования

что такое загрузка класса

Загрузка класса относится к чтению двоичных данных в файле .class класса в память, размещению их в области методов области данных среды выполнения, а затем созданию объекта java.lang.Class в области кучи для инкапсуляции структура данных класса в области методов. Конечным продуктом загрузки класса является объект Class, расположенный в области кучи.Объект Class инкапсулирует структуру данных класса в области методов и предоставляет Java-программистам интерфейс для доступа к структуре данных в области методов.

жизненный цикл класса

Жизненный цикл класса включает в себя следующие части: загрузку, подключение, инициализацию, использование и выгрузку, из которых первые три части представляют собой процесс загрузки класса, как показано на следующем рисунке;

  • Загрузите, найдите и загрузите бинарные данные класса, также создайте объект класса java.lang.Class в куче Java

  • Подключение, подключение включает в себя три части: проверка, подготовка, инициализация. 1) Проверка, формат файла, метаданные, байт-код, проверка символьной ссылки; 2) Подготовить, выделить память для статических переменных класса и инициализировать их значениями по умолчанию; 3) Разобрать, преобразовать символьные ссылки в классе в прямую кавычку

  • Инициализация, присвоение правильных начальных значений статическим переменным класса

  • Использовать, использовать в новой объектной программе

  • Удалить, выполнить сборку мусора

Несколько небольших вопросов?1. Этапы инициализации JVM? 2. Когда время инициализации класса? 3. При каких обстоятельствах виртуальная машина Java завершит свой жизненный цикл?Для ответа обратитесь к этой статьеСерия JVM (1): механизм загрузки классов Java

загрузчик классов

  • Загрузчик классов запуска: Bootstrap ClassLoader, отвечающий за загрузку библиотеки классов, хранящейся в JDK\jre\lib (JDK представляет собой каталог установки JDK, то же самое ниже) или по пути, указанному параметром -Xbootclasspath, и может быть распознан виртуальная машина

  • Загрузчик классов расширения: расширение ClassLoader, реализованное sun.misc.Launcher$ExtClassLoader, которое отвечает за загрузку всех классов в каталоге DK\jre\lib\ext или пути, указанном системной переменной java.ext.dirs. Библиотеки. (например, классы, начинающиеся с javax.*), разработчики могут напрямую использовать загрузчик классов расширения.

  • Загрузчик класса приложения: Application ClassLoader, реализованный sun.misc.Launcher$AppClassLoader, который отвечает за загрузку классов, указанных путем пользовательского пути к классу (ClassPath), и разработчики могут использовать этот загрузчик классов напрямую.

механизм загрузки классов

  • Общая ответственность, когда загрузчик классов отвечает за загрузку класса, другие классы, от которых зависит класс, и ссылки также будут загружены загрузчиком классов, если для загрузки не отображается другой загрузчик классов.

  • Делегирование родительского класса, пусть загрузчик родительского класса сначала попытается загрузить класс и попытается загрузить класс только из своего собственного пути к классу, когда загрузчик родительского класса не может загрузить класс.

  • Механизм кэширования, механизм кэширования гарантирует, что все загруженные классы будут кэшированы.Когда класс необходимо использовать в программе, загрузчик классов сначала ищет класс из области кэша, и система будет читать класс, только если области кэша не существует.Двоичные данные, соответствующие классу, преобразуются в объект класса и сохраняются в области буфера. Вот почему после изменения класса необходимо перезапустить JVM, чтобы изменение программы вступило в силу.

структура памяти JVM

Основное внимание:

  • какая структура памяти jvm

  • Правила назначения объектов

структура памяти JVM

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

  • Куча Java (Heap) — это самый большой участок памяти, которым управляет виртуальная машина Java. Куча Java — это область памяти, совместно используемая всеми потоками, которая создается при запуске виртуальной машины. Единственной целью этой области памяти является хранение экземпляров объектов, и почти все экземпляры объектов выделяют здесь память.

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

  • Счетчик программ (Program Counter Register), счетчик программ (Program Counter Register) представляет собой небольшое пространство памяти, его функцию можно рассматривать как индикатор номера строки байт-кода, выполняемого текущим потоком.

  • Стеки JVM (стеки JVM), как и счетчики программ, стеки виртуальных машин Java (стеки виртуальных машин Java) также являются потокозависимыми и имеют тот же жизненный цикл, что и потоки. Стек виртуальной машины описывает модель памяти выполнения метода Java: при выполнении каждого метода одновременно создается кадр стека для хранения таблицы локальных переменных, стека операций, динамической ссылки, выхода из метода и другой информации. Процесс каждого вызываемого метода до завершения выполнения соответствует процессу помещения кадра стека в стек в стеке виртуальной машины.

  • Стеки нативных методов (Native Method Stacks), стеки нативных методов (Native Method Stacks) и стек виртуальной машины играют очень похожую роль, разница в том, что стек виртуальной машины выполняет Java-методы (то есть байт-код) для виртуальной машины. Службы, а стек собственных методов — это служба собственных методов, используемая виртуальной машиной.

Правила назначения объектов

  • Объекты преимущественно размещаются в области Eden, если в области Eden недостаточно места, виртуальная машина выполняет Minor GC.

  • Большие объекты уходят сразу в старость (большие объекты — это объекты, требующие много непрерывного пространства памяти). Цель этого состоит в том, чтобы избежать большого количества копий памяти между областью Эдема и двумя областями Выживших (новое поколение использует алгоритм копирования для сбора памяти).

  • Долгоживущие объекты вступают в старость. Виртуальная машина определяет счетчик возраста для каждого объекта.Если объект прошел один Minor GC, объект попадет в зону Survivor.После каждого Minor GC возраст объекта будет увеличиваться на 1, пока объект не достигнет порога и входит в зону престарелых.

  • Динамическое определение возраста объекта. Если сумма размеров всех объектов одного возраста в области Survivor больше половины пространства Survivor, объекты, возраст которых больше или равен этому возрасту, могут напрямую войти в старость.

  • Гарантия выделения места. Каждый раз, когда выполняется Minor GC, JVM будет вычислять средний размер объектов, перемещенных из области Survivor в старую область.Если это значение больше, чем оставшееся значение старой области, будет выполняться Full GC.Если меньше, чем параметр HandlePromotionFailure, будет выполняться только Monitor.GC, если false, выполняется Full GC. 

Как управлять каждой областью памяти через параметрыОбратитесь к этой статье:Серия JVM (2): структура памяти JVM

Алгоритм сборки мусора GC

Основное внимание:

  • Оценка выживания объекта

  • Алгоритм сборки мусора

  • уборщик мусора

Оценка выживания объекта

Обычно существует два способа определить, является ли объект живым:

  • Счетчик ссылок: у каждого объекта есть атрибут счетчика ссылок.При добавлении новой ссылки счетчик увеличивается на 1, а когда ссылка освобождается, счетчик уменьшается на 1. Когда счетчик равен 0, его можно использовать повторно. Этот метод прост и не может решить проблему циклической ссылки объектов друг на друга.

  • Анализ достижимости: поиск вниз от корней GC, и путь, пройденный поиском, называется цепочкой ссылок. Когда объект не имеет какой-либо цепочки ссылок, связанной с корнями GC, это доказывает, что объект недоступен и недоступен.

Алгоритм сборки мусора

Существует три основных алгоритма GC: алгоритм пометки-очистки, алгоритм копирования, алгоритм пометки-сжатия, наши обычно используемые сборщики мусора обычно используют алгоритм сбора поколений.

  • Алгоритм маркировки-развертки, алгоритм «Марк-развертка» (Mark-Sweep), как следует из его названия, алгоритм делится на «маркировку» и «развертку» в два этапа: сначала помечают все объекты, которые необходимо переработать, после завершения маркировки Собирают все отмеченные объекты равномерно.

  • Алгоритм копирования, алгоритм сбора «копирования», делит доступную память на два блока одинакового размера в соответствии с их емкостью и использует только один из них за раз. Когда память этого блока израсходована, уцелевшие объекты копируются в другой блок, а затем однократно очищается использованное пространство памяти.

  • Алгоритм маркировки-сжатия, процесс маркировки такой же, как и алгоритм «маркировки-очистки», но последующие шаги заключаются не в непосредственной очистке перерабатываемых объектов, а в перемещении всех уцелевших объектов в один конец, а затем непосредственной очистке. память за пределами конечной границы

  • Алгоритм сбора поколений, алгоритм «Коллекции поколений», делит кучу Java на новое поколение и старое поколение, чтобы можно было выбрать наиболее подходящий алгоритм сбора в соответствии с характеристиками каждого поколения.

уборщик мусора

  • Последовательные сборщики, самые старые, самые стабильные и эффективные сборщики, могут иметь длительные паузы и использовать только один поток для перезапуска.

  • Сборщик ParNew, сборщик ParNew на самом деле является многопоточной версией сборщика Serial.

  • Сборщик Parallel, сборщик Parallel Scavenge аналогичен сборщику ParNew, сборщик Parallel уделяет больше внимания пропускной способности системы.

  • Сборщик Parallel Old, Parallel Old — это старая версия сборщика Parallel Scavenge, использующая многопоточность и алгоритм «пометки и сортировки».

  • Сборщик CMS, сборщик CMS (Concurrent Mark Sweep) — сборщик, целью которого является получение кратчайшего времени паузы восстановления.

  • Сборщик G1, G1 (Garbage-First) — серверно-ориентированный сборщик мусора, в основном для машин, оснащенных несколькими процессорами и памятью большого объема, с высокой вероятностью может удовлетворять требованиям времени паузы GC, а также имеет высокие количественные характеристики пропускной способности.

Диаграмма алгоритма GC и алгоритма сборщика мусора и более подробная ссылка на содержание:Серия JVM (3): сборщик мусора алгоритма GC

Настройка команды анализа ГХ

Основное внимание:

  • Анализ журнала сборщика мусора

  • Команды настройки

  • Инструменты настройки

Анализ журнала сборщика мусора

Выдержка из журнала GC

Журнал утилизации Young GC:

  1. 2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]

скопировать код

Полный журнал утилизации GC:

  1. 2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]

скопировать код

Согласно приведенному выше анализу журнала, PSYoungGen, ParOldGen и PSPermGen принадлежат сборщику Parallel. Среди них PSYoungGen указывает внутреннее содержание молодого поколения до и после рециклинга GC.

Согласно приведенному выше анализу журнала, PSYoungGen, ParOldGen и PSPermGen принадлежат сборщику Parallel. Среди них PSYoungGen представляет изменение памяти молодого поколения до и после рекультивации gc; ParOldGen представляет изменение памяти старого поколения до и после рекультивации gc; PSPermGen представляет изменение памяти постоянной области до и после рекультивации gc. Молодой сборщик мусора в основном часто перерабатывает память для молодого поколения и занимает меньше времени; полный сборщик мусора возвращает всю память кучи городу, что занимает много времени, поэтому обычно старайтесь максимально сократить количество полных сборщиков мусора.

Журнал молодого ГК:

Полный журнал сборщика мусора:

Справочник по анализу Java GC:Серия jvm (5) Анализ Java GC

Команды настройки

Команды Sun JDK для мониторинга и устранения неполадок: jps jstat jmap jhat jstack jinfo

  • jps, инструмент состояния процессов JVM, отображает все процессы виртуальной машины HotSpot в указанной системе.

  • jstat, Статистика JVM Мониторинг — это команда, используемая для мониторинга информации о состоянии выполнения виртуальной машины.Он может отображать текущие данные, такие как загрузка классов, память, сборка мусора и JIT-компиляция в процессе виртуальной машины.

  • jmap, команда карты памяти JVM используется для создания файлов дампа кучи

  • jhat, команда JVM Heap Analysis Tool используется совместно с jmap для анализа дампа, сгенерированного jmap.jhat имеет встроенный миниатюрный HTTP/HTML-сервер.После того как результат анализа дампа сгенерирован, его можно просмотреть в браузер.

  • jstack, который используется для создания моментального снимка текущего момента виртуальной машины Java.

  • jinfo, Информация о конфигурации JVM Эта команда используется для просмотра и настройки параметров работы виртуальной машины в режиме реального времени.

Подробнее об использовании команды см. здесь:Серия JVM (4): настройка JVM — команды

Инструменты настройки

Обычно используемые инструменты настройки делятся на две категории, jdk поставляется с инструментами мониторинга: jconsole и jvisualvm, а сторонние включают: MAT (Memory Analyzer Tool), GChisto.

  • jconsole, Консоль мониторинга и управления Java — это консоль мониторинга и управления Java, которая поставляется с JDK, начиная с java5, которая используется для мониторинга памяти, потоков и классов в JVM.

  • jvisualvm, jdk поставляется с универсальным инструментом, который может анализировать снимки памяти, снимки потоков, отслеживать изменения памяти, изменения GC и т. д.

  • MAT, Memory Analyzer Tool, инструмент анализа памяти на основе Eclipse, представляет собой быстрый, многофункциональный инструмент анализа кучи Java, который может помочь нам найти утечки памяти и сократить потребление памяти.

  • GChisto, профессиональный инструмент для анализа журналов сборщика мусора

Справочник по использованию инструмента: серия JVM (7): настройка JVM — инструменты

Для выдающихся талантов нет недостатка в возможностях трудоустройства, для них есть только хорошие возможности. Но у них часто нет энергии, чтобы найти наилучший вариант среди множества возможностей. 100offerТаланты и компании на платформе будут строго проверяться, чтобы «лучшие таланты» и «лучшие компании» могли встретиться. Отсканируйте приведенный ниже QR-код, подпишитесь на 100offer и расскажите о своих ожиданиях от следующей работы. В течение недели получите 5-10 отличных возможностей для удовлетворения ваших требований!