JVM вы должны знать
Сегодня мы поговорим о JVM (Виртуальная машина Java) Как о Java-разработке JVM является первым краеугольным камнем вашей практики Java-разработки. Поскольку для запуска Java-программ необходимо установить пакет JDK или JRE, все они включают в себя JVM, и можно сказать, что JVM является ядром языка Java. Эта часть JVM немного непонятна и трудна для чтения, и я не очень хочу говорить об этой части, потому что о ней говорят слишком много людей. Если вы ясно объясняете содержание JVM, это не означает, что вы сильны, но если вы этого не понимаете, это должно означать, что вы не очень хороши. В определенной степени соответствующие знания JVM стали нижним пределом возможностей Java-разработки, и избежать этого не может никто. В таком случае, давайте вместе отведаем эту горькую тыкву. Я поделюсь с вами своими знаниями, основанными на структуре памяти JVM, принципах GC и настройке конфигурации.
Структура памяти JVM
В Java структура памяти JVM в основном делится на"Куча, счетчик программ, область методов, стек виртуальной машины"а также"собственный стек методов". Этот пункт знаний также является вопросом, который должен появиться в интервью. Я взял интервью у некоторых разработчиков. После нескольких кратких представлений первый вопрос был: «Давайте, позвольте мне сначала представить структуру памяти JVM». Для большей наглядности картинка выше!
Что именно делают пять модулей JVM? Давайте двигаться дальше.
счетчик команд
❝Счетчик программы — это небольшое пространство памяти, которое действует как индикатор номера строки байт-кода, выполняемого текущим потоком. В концептуальной модели виртуальной машины, когда интерпретатор байт-кода работает, он выбирает следующую инструкцию байт-кода для выполнения, изменяя значение этого счетчика.Основные функции, такие как ветвление, цикл, переход, обработка исключений и восстановление потока, все требуется. Положитесь на этот счетчик для завершения. "Глубокое понимание виртуальной машины Java"
❞
Всем известно, что Java является многопоточным языком, когда количество потоков, выполняемых в программе, превышает количество ядер ЦП, потоки будут опрашивать ресурсы ЦП в соответствии с временными интервалами. знаком с этим.
Если квант времени потока израсходован или ресурсы ЦП этого потока заранее заняты из-за исключений или ожидания, то программный счетчик должен записать, где находится текущая операция и должна быть выполнена следующая инструкция. Когда завершенный поток получит здесь ресурсы ЦП в следующий раз, он продолжит выполняться без хаоса. Это как пойти в интернет-кафе, чтобы поиграть в однопользовательскую ролевую игру, когда я был ребенком.Поскольку в игру нельзя было играть за один день, я сделал сохранение, когда отключился от компьютера. Когда я в следующий раз приду в интернет-кафе, я подойду к этой машине, чтобы продолжить загрузку архива и продолжать радоваться.
"Функции:"
- Он имеет характеристики изоляции резьбы;
- Занимаемое пространство очень мало, и им можно пренебречь;
- Единственная область в спецификации виртуальной машины Java, в которой не указывается OOM;
- Когда программа работает, программный счетчик имеет значение, которое записывает адрес исполняемого байт-кода;
- Когда собственный метод выполняется, значение счетчика программы пусто, потому что собственный метод является реализацией байт-кода, отличной от Java, и его нельзя подсчитать;
куча
Куча является самым большим пространством памяти в памяти JVM, почти все объекты и массивы, созданные в программе, размещаются в куче, эта память является общей для всех потоков, а базовые типы данных не хранятся в памяти кучи. После JDK1.8 куча делится на молодое поколение и старое поколение. Новое поколение далее разделено на области Eden (Эдем) и Survivor (выживший). Зона выживших разделена на две части: «Откуда» и «Куда». Конкретно что хранится в каждой области и каков процесс?Давайте посмотрим на это позже, сначала посмотрите на картинку:
До JDK1.8 существовало постоянное поколение, и постоянное поколение было частью кучи. Поскольку объем памяти по умолчанию для постоянного поколения (PermGen) составляет 8 МБ, часто возникают исключения OOM, а при повторном использовании скорость повторного использования очень низкая. Поэтому после JDK1.8 его заменили метапространством. Место, где хранится метапространство, — это локальная память (все это можно найти на официальном сайте Java). Так что в некоторых интервью, прежде чем объяснять структуру кучи памяти, нужно сначала указать версию.
стек виртуальных машин
Стек виртуальной машины Java описывает структуру памяти выполнения метода Java: кадр стека создается при выполнении каждого метода.
❝Фрейм стека — это структура данных, используемая для поддержки виртуальной машины при вызове и выполнении метода. Это элемент стека стека виртуальной машины Java в области данных среды выполнения виртуальной машины. Фрейм стека хранит таблицу локальных переменных метода, стек операндов, пул констант времени выполнения, адрес возврата метода и другую информацию.
❞
Когда поток выполняет метод, он создает соответствующий кадр стека и помещает созданный кадр стека в стек. Когда метод завершает выполнение, кадр стека извлекается из стека. Следовательно, видно, что кадр стека, соответствующий методу, выполняемому в данный момент потоком, должен находиться наверху стека Java.
Интервью в основном спрашивает: концепция фрейма стека, извлечение фрейма стека, стекирование и метод запуска программы.Необходимый фрейм стека должен быть на вершине стека. Существует также исключение StackOverflowError, поскольку объем памяти, запрошенный исполнителем, больше, чем ошибка памяти стека.
"Функции:"
- Стек виртуальной машины Java также изолирован от потоков, и его жизненный цикл такой же, как и у потоков (рождается вместе с потоками и уничтожается потоками);
- Если глубина стека, запрошенная потоком, больше глубины, разрешенной виртуальной машиной, будет выдано исключение StackOverflowError;
- Сохранять локальные переменные метода (8 базовых типов данных, адрес ссылки на объект), частичные результаты и участвовать в вызове и возврате метода;
область метода
Область методов в основном используется для хранения информации, связанной с классом, которая была загружена виртуальной машиной, включая информацию о классе, пул констант времени выполнения и пул строковых констант. Информация о классе также включает такую информацию, как версия, поля, методы, интерфейсы и родительские классы класса.
"Функции:"
- Как и куча, область методов — это область памяти, совместно используемая каждым потоком;
- Он создается при запуске JVM, и его фактическое пространство физической памяти может быть прерывистым, как область кучи Java.
- Как и в куче, вы можете выбрать фиксированный размер или расширяемый;
- Размер области методов определяет, сколько классов может сохранить система.Если система определяет слишком много классов, область методов переполняется и генерируется исключение OOM;
- Закрытие JVM освободит память в этой области;
собственный стек методов
Функции стека собственных методов аналогичны функциям стека виртуальной машины Java.Стек виртуальной машины Java используется для управления вызовом функций Java, а стек собственных методов используется для управления вызовом собственных методов. Но нативные методы реализованы не в Java, а в C.
Рабочий механизм JVM
Концепции, связанные со структурой памяти JVM, были вам представлены выше.Теперь давайте на примере кода посмотрим, как код, который мы обычно пишем, работает в JVM. Традиционное мастерство: Код!
По коду разбираем весь процесс загрузки классов во всей JVM.
- JVM обращается за памятью к операционной системе через свою собственную конфигурацию, находит таблицу распределения памяти операционной системы в соответствии с размером памяти, а затем назначает начальный адрес и конечный адрес сегмента памяти JVM, а затем JVM выполняет внутреннее размещение;
- JVM выделяет размер памяти для кучи, стека и области методов в соответствии с параметрами запуска;
- загрузка, проверка, подготовка и разбор файла класса, выделение памяти для статических переменных;
- этап инициализации. На этом этапе JVM сначала выполнит метод конструктора clinit, а компилятор соберет код инициализации всех классов при компиляции файла .Java в файл .class, включая операторы присваивания статических переменных, статические блоки кода и статические методы вместе становятся клинит-методом;
- Выполнить метод, запустить основной поток, выполнить основной метод, создать объект People в куче памяти и присвоить значения;
- Создайте объект JvmRunDemo и вызовите нестатический метод кода. Метод кода принадлежит объекту JvmRunDemo. В это время метод кода помещается в стек, а объект People в куче вызывается через ссылку на людей в После этого вызывается статический метод showPeopleInfo, и статический метод принадлежит классу JvmRunDemo.Объект People в стеке также вызывается ссылкой на людей, когда он помещается в стек.
конец
Сегодня я поделюсь с вами некоторыми основными концепциями JVM и примерно опишу процесс загрузки классов JVM.Из-за большого объема контента место ограничено. Это все, что касается этой статьи, а следующая статья даст вам пошаговое объяснение разделения в сочетании с фактическим кодом и методами декомпиляции кода, чтобы подробно объяснить каждую ссылку. Эта часть контента относится к основной основе языка Java, я надеюсь, что вы продолжите уделять внимание, спасибо.
"Прошлые статьи:"
«[Развитие внутренней силы, серия 1] Линейная структура данных (Часть 1)»
«[Развитие внутренней силы, серия 1] Линейная структура данных (Часть II 1)»
«[Внутреннее совершенствование, серия 1] Линейная структура данных (Часть 2)»
ВАЖНО: ПЛАНИРОВАНИЕ СЕРИИ
В прошлые выходные я поделился тремя статьями о содержании серии тренировок внутренней силы 1. Я потратил много времени на ее разбор, а также занял время на отдых. Хотя содержание является базовым знанием, я знаком с ним, но после его завершения у меня все еще есть много достижений. Это суть того, что учитель китайского языка в младших классах средней школы сказал о «повторении старого и изучении нового» и «прочтении книги сто раз и понимании смысла для себя». Из объема чтения статьи и комментариев я обнаружил, что студенты, которые ее прочитали, все же кое-что получили, что также является для меня радостью. Это также основная цель моего письма: дать каждому читателю что-то полезное.
Некоторым учащимся может показаться, что написанное слишком просто, и они могут уделять им меньше внимания в работе, а некоторые вещи могут даже не использоваться. Я тоже тщательно обдумывал это, ведь у студентов на разных этапах разные неотложные потребности.
- Для студентов, которые только что закончили обучение, они могут просто захотеть сначала использовать вещи, а затем говорить об основных вещах.
- Для студентов с 2-3 годами опыта разработки это может быть только для собеседований и бредовых вопросов, баллы базовых знаний кажутся более полезными.
- Эти вещи, вероятно, слишком поверхностны для архитектора, чтобы быть точкой архитектурного мышления в моей работе.
Во внутренних сообщениях моей компании я часто упоминал, что невозможно охватить потребности всех одновременно, если только это не «руководство для сотрудников». . Каждый может только фильтровать и думать самостоятельно из общего контента и получать от него то, что ему нужно. В конце концов, технология разработки программного обеспечения, основные основные концепции и способы мышления выясняются.
В ответ на вышеизложенное я планирую выпустить три серии: «Серия о развитии внутренней силы», «Серия о практических инструментах» и «Серия о строительстве высоких домов».
- [Серия культивирования Nei Gong] в основном направлена на то, чтобы поделиться базовым содержанием Java, что призвано углубить понимание основ;
- [Серия служебных инструментов] в основном для инструментов, промежуточного программного обеспечения и т. д., используемых в повседневной разработке, чтобы помочь вам повысить эффективность и решить практические проблемы;
- [Серия высотных зданий] Начиная с архитектурного мышления, для существующих бизнес-примеров поделитесь методом архитектурного строительства;
Тема сериала, буду вперемежку делиться. Я надеюсь, что мы можем продолжать сосредоточиться, я произвел эти серии оригинальные гарантии, поделиться опытом разработки и многолетним личным накоплением. В некоторых местах даже вид может быть неправильным, пожалуйста, выставки. Ваша поддержка - моя самая большая мотивация! благодарный.
специальное заявление
Данная статья является оригинальной статьей, если вам необходимо перепечатать, пожалуйста, свяжитесь со мной и укажите источник. Спасибо!