add description list in menu
This commit is contained in:
parent
095d90b962
commit
b05ebc28af
11
README.md
11
README.md
|
@ -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
94
jvm.md
|
@ -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.
|
||||
Cтеки в 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)
|
||||
|
|
Loading…
Reference in New Issue