1
1
Fork 0

add description list in menu

This commit is contained in:
andrey.ashomok 2020-03-06 12:39:45 +02:00 committed by Enchased Horse
parent 095d90b962
commit b05ebc28af
2 changed files with 61 additions and 44 deletions

View File

@ -1,6 +1,7 @@
# Вопросы для собеседования на Java Developer
+ [ООП](#ООП) ![icon][done]
+ [JVM](#jvm) ![icon][done]
+ [Java Core](#java-core) ![icon][done]
+ [Java Collections Framework](#java-collections) ![icon][done]
+ [Java 8](#java-8) ![icon][done]
@ -39,6 +40,16 @@
[к оглавлению](#Вопросы-для-собеседования-на-java-developer)
## JVM
+ [За что отвечает JVM](jvm.md#За-что-отвечает-JVM)
+ [Classloader](jvm.md#Classloader)
+ [Области данных времени выполнения](jvm.md#Области-данных-времени-выполнения)
+ [Frames](jvm.md#Frames)
+ [Execution Engine](jvm.md#Execution-Engine)
+ [Полезные ссылки](jvm.md#Полезные-ссылки)
[к оглавлению](#Вопросы-для-собеседования-на-java-developer)
## Java Core
+ [Чем различаются JRE, JVM и JDK?](core.md#Чем-различаются-jre-jvm-и-jdk)
+ [Какие существуют модификаторы доступа?](core.md#Какие-существуют-модификаторы-доступа)

94
jvm.md
View File

@ -1,4 +1,16 @@
###### JVM (Java Virtual Machine)
## JVM (Java Virtual Machine)
+ [За что отвечает JVM](jvm.md#За-что-отвечает-JVM)
+ [Classloader](jvm.md#Classloader)
+ [Области данных времени выполнения](jvm.md#Области-данных-времени-выполнения)
+ [Frames](jvm.md#Frames)
+ [Execution Engine](jvm.md#Execution-Engine)
+ [Полезные ссылки](jvm.md#Полезные-ссылки)
## За что отвечает _JVM_:
+ Загрузка, проверка и исполнение байт кода;
+ Предоставление среды выполнения для выполнения байт-кода;
+ Управление памятью и очисткой мусора (Garbage collection);
Виртуальная машина Java (JVM) - это механизм, предоставляющий среду выполнения для управления Java-кодом или приложениями.
Виртуальная машина является независимой оболочкой исполнения кода, благодаря которой возможен её запуск на любой ОС,
@ -19,15 +31,11 @@ JVM работает с примитивными значениями (целы
Существует три типа ссылочных типов: типы классов, типы массивов и типы интерфейсов.
Их значения являются ссылками на динамически создаваемые экземпляры классов, массивы или экземпляры классов или массивы,
которые реализуют интерфейсы соответственно.
которые реализуют интерфейсы соответственно.
[к оглавлению](#JVM)
###### За что отвечает JVM:
1. Загрузка, проверка и исполнение байт кода;
2. Предоставление среды выполнения для выполнения байт-кода;
3. Управление памятью и очисткой мусора (Garbage collection);
###### 1. Classloader (Загрузчик классов)
## Classloader (Загрузчик классов)
Java Classloader является частью JRE, которая динамичиски закгружает Java классы в JVM.
Обычно классы загружаются только по запросу. Система исполнения в Java не должна знать о файлах и файловых системах
@ -74,12 +82,14 @@ Java Classloader является частью JRE, которая динами
* изменить способ загрузки байт-кода (например, можно использовать зашифрованный байт-код класса Java);
* модифицировать загруженный байт-код (например, для переплетения аспектов во время загрузки при использовании аспектно-ориентированного программирования);
###### 2. Области данных времени выполнения (Run-Time Data Areas)
[к оглавлению](#JVM)
## Области данных времени выполнения (Run-Time Data Areas)
JVM выделяет множество областей данных во время выполнения, к-рые используются во время выполнения программы. Некоторые участки данных
созданы JVM во время старта и уничтожаются во время её выключения. Другие создаются для каждого потока и уничтожаются когда поток уничтожается.
2.1. The pc Register (PCR)
**The pc Register (PCR)**
Виртуальная машина Java может поддерживать много потоков исполнения одновременно. Каждый поток виртуальной машины Java имеет свой собственный регистр PC (programm counter).
В любой момент каждый поток виртуальной машины Java выполняет код одного метода, а именно текущий метод для этого потока.
@ -87,12 +97,12 @@ JVM выделяет множество областей данных во вр
Коротко говоря: для одного потока существует один PCR, который создается при запуске потока. PCR хранит адрес выполняемой сейчас инструкции JVM.
2.2. Java Virtual Machine Stacks
**Java Virtual Machine Stacks**
Каждый поток в JVM имеет собственный стек, созданный одновременно с потоком. Стек в JVM хранит frames.
еки в JVM могут иметь фиксированный размер или динамически расширяться и сжиматься в соответствии с требованиями вычислений.
2.3. Heap
**Heap**
JVM имеет heap (кучу), которая используется всеми потоками виртуальной машины Java.
Куча - это область данных времени выполнения, из которой выделяется память для всех экземпляров и массивов классов.
@ -103,14 +113,14 @@ JVM не предполагает какого-либо конкретного
Куча может иметь фиксированный размер или может быть расширена в соответствии с требованиями вычислений и может быть сокращена,
если большая куча становится ненужной. Память для кучи не должна быть смежной.
2.4. Method Area
**Method Area**
JVM имеет область методов, которая является общей для всех потоков. Она хранит структуры для каждого класса, такие как пул констант, данные полей и методов,
а также код для методов и конструкторов, включая специальные методы, используемые при инициализации классов и экземпляров и инициализации интерфейса.
Хотя область метода является логически частью кучи, простые реализации могут не обрабатываться собиращиком мусора. Область метода может иметь
фиксированный размер или может быть расширена в соответствии с требованиями вычислений и может быть сокращена, если большая область метода становится ненужной.
2.5. Run-Time Constant Pool
**Run-Time Constant Pool**
A run-time constant pool существует для каждого класса или интерфейса в рантайме и представленно constant_pool таблицей в *.class файле.
Он содержит несколько видов констант: от числовых литералов, известных во время компиляции, до ссылок на методы и поля,
@ -118,12 +128,13 @@ JVM имеет область методов, которая является о
аналогичную функции таблицы символов для обычного языка программирования, хотя он содержит более широкий диапазон данных, чем типичная таблица символов.
Каждый run-time constant pool отделён от JVM's method area. JVM создаёт run-time constant pool вместе с созданием class или interface.
2.6. Native Method Stacks
**Native Method Stacks**
Реализация виртуальной машины Java может использовать обычные стеки, обычно называемые «стеки Си», для поддержки native methods (методов, написанных на языке, отличном от языка программирования Java).
[к оглавлению](#JVM)
###### 3. Frames
## Frames
Frame используется для хранения данных и частичных результатов, а также для выполнения динамического связывания, возврата значений для методов и отправки исключений.
Новый frame создается каждый раз, когда вызывается метод. Frame уничтожается, когда завершается вызов метода,
@ -140,7 +151,7 @@ Frame перестает быть текущим, если его метод в
Текущий frame затем отбрасывается, так как предыдущий frame становится текущим. Обратите внимание, что frame, созданный потоком,
является локальным для этого потока и на него не может ссылаться ни один другой поток.
3.1. Локальные переменные
**Локальные переменные**
Каждый frame содержит массив переменных, известных как его локальные переменные. Длина массива локальных переменных frame определяется во время компиляции
и предоставляется в двоичном представлении класса или интерфейса вместе с кодом для метода, связанного с frame-ом.
@ -155,7 +166,7 @@ JVM использует локальные переменные для пере
начиная с локальной переменной 0. При вызове метода экземпляра локальная переменная 0 всегда используется для передачи ссылки на объект,
для которого вызывается метод экземпляра (this в Java). Любые параметры впоследствии передаются в последовательных локальных переменных, начиная с локальной переменной 1.
3.2. Стеки операндов (Operand Stacks)
**Стеки операндов (Operand Stacks)**
Каждый frame содержит стек «последний вошел - первый вышел» (LIFO), известный как стек операндов. Максимальная глубина стека операндов frame-a
определяется во время компиляции и предоставляется вместе с кодом для метода, связанного с frame-ом.
@ -168,9 +179,9 @@ JVM использует локальные переменные для пере
Для примера, инструкция **iadd** суммирует два int-вых значения. От стека операндов требуется, чтобы два int-вых значения были наверху стека.
Значения удаляются из стека, операция **pop**. Суммируются и их сумма помещается в стек операндов.
3.3. Динамическое связывание (Dynamic Linking)
**Динамическое связывание (Dynamic Linking)**
Каждый frame содержит ссылку на run-time constant pool (2.5) для типа текущего метода для поддержки динамического связывания кода метода.
Каждый frame содержит ссылку на run-time constant pool для типа текущего метода для поддержки динамического связывания кода метода.
Доступ к вызываемым методам и переменным осуществляется через символические ссылки из class файла.
Динамическое связывание преобразует эти символьные ссылки на методы в конкретные ссылки на методы, загружая классы по мере необходимости
для разрешения пока еще не определенных символов, и преобразует обращения к переменным в соответствующие смещения в структурах хранения,
@ -178,55 +189,50 @@ JVM использует локальные переменные для пере
Позднее связывание методов и переменных вносит изменения в другие классы, которые метод использует с меньшей вероятностью нарушить этот код.
3.5. Нормальное завершение вызова метода
**Нормальное завершение вызова метода**
Вызов метода завершается нормально, если этот вызов не вызывает исключение, либо непосредственно из JVM, либо в результате выполнения явного оператора throw.
Если вызов текущего метода завершается нормально, то значение может быть возвращено вызывающему методу.
Это происходит, когда вызванный метод выполняет одну из инструкций возврата, выбор которых должен соответствовать типу возвращаемого значения (если оно есть).
Текущий frame используется в этом случае для восстановления состояния инициатора, включая его локальные переменные и стек операндов,
с соответствующим образом увеличенным программным счетчиком инициатора (2.1), чтобы пропустить инструкцию вызова метода.
с соответствующим образом увеличенным программным счетчиком инициатора, чтобы пропустить инструкцию вызова метода.
Затем выполнение обычно продолжается в frame вызывающего метода с возвращенным значением (если оно есть), помещаемым в стек операндов этого frame.
3.6. Резкое завершение вызова метода
**Резкое завершение вызова метода**
Вызов метода завершается преждевременно, если при выполнении инструкции JVM в методе выдает исключение, и это исключение не обрабатывается в методе.
Выполнение команды **athrow** также приводит к явному выбрасыванию исключения, и если исключение не перехватывается текущим методом,
приводит к неожиданному завершению вызова метода. Вызов метода, который завершается внезапно, никогда не возвращает значение своему вызывающему.
###### 4. Execution Engine
[к оглавлению](#JVM)
## Execution Engine
Байт-код, назначенный **run-time data areas**, будет выполнен **execution engine**. Механизм выполнения считывает байт-код и выполняет его по частям.
4.1. Interpreter
**Interpreter**
Интерпретатор интерпретирует байт-код быстро, но выполняется медленно. Недостаток интерпретатора заключается в том, что когда один метод вызывается несколько раз, каждый раз требуется новая интерпретация.
4.2. JIT Compiler
**JIT Compiler**
JIT-компилятор устраняет недостатки интерпретатора. Механизм выполнения будет использовать помощь интерпретатора при преобразовании байт-кода,
но когда он находит повторный код, он использует JIT-компилятор, который компилирует весь байт-код и изменяет его на собственный код.
Этот нативный код будет использоваться непосредственно для повторных вызовов методов, которые улучшают производительность системы.
4.2.1. Генератор промежуточного кода (Intermediate Code Generator)
+ Генератор промежуточного кода (Intermediate Code Generator). Производит промежуточный код.
+ Code Optimizer. Отвечает за оптимизацию промежуточного кода, сгенерированного выше.
+ Генератор целевого кода (Target Code Generator). Отвечает за генерацию машинного кода или родной код.
+ Профилировщик (Profiler). Специальный компонент, отвечающий за поиск горячих точек, то есть, вызывается ли метод несколько раз или нет.
Производит промежуточный код.
**Garbage Collector**
4.2.2.Code Optimizer
[к оглавлению](#JVM)
Отвечает за оптимизацию промежуточного кода, сгенерированного выше.
4.2.3. Генератор целевого кода (Target Code Generator)
Отвечает за генерацию машинного кода или родной код.
4.2.4. Профилировщик (Profiler)
Специальный компонент, отвечающий за поиск горячих точек, то есть, вызывается ли метод несколько раз или нет.
4.3. Garbage Collector
Полезные ссылки с доп. информацией:
- https://www.developer.com/java/data/understanding-the-jvm-architecture.html
## Полезные ссылки:
- https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
- https://dzone.com/articles/understanding-jvm-internals
- https://www.developer.com/java/data/understanding-the-jvm-architecture.html
- https://dzone.com/articles/understanding-jvm-internals
[к оглавлению](#JVM)