С момента выпуска Java в 1996 году Java стал популярным языком среди разработчиков во всем мире. Java — это высокоуровневый, универсальный, объектно-ориентированный и безопасный язык программирования.
Сегодня он превратился в полноценную платформу для создания, развертывания и запуска самых разных приложений. Для достижения переносимости Java использует концепцию виртуальной машины (ВМ). Виртуальная машина Java или JVM загружает, проверяет и выполняет байт-код Java. Он известен как интерпретатор или ядро языка программирования Java, потому что он выполняет программирование Java.
Исходный файл Java компилируется в байт-код, состоящий из набора инструкций псевдопроцессора. Этот ЦП эмулируется в памяти запущенным процессом, а скомпилированный байт-код запускается на эмуляторе. Это позволяет запускать исполняемые файлы Java на любой платформе с JVM (виртуальная машина Java). Кроме того, он имеет еще несколько модулей для обеспечения безопасности, управления памятью и потоками и других целей. JVM — это, по сути, машина, способная запускать исполняемый файл Java. Как показано на рисунке, JVM и ее основные компоненты, актуальные для нас в настоящее время.
Три понятия JVM
Спецификация:
Документ, описывающий требования к реализации JVM. Но поставщик реализации независим в выборе алгоритма.
Реализация:
Его реализация известна как JRE (Java Runtime Environment).
Экземпляр времени выполнения:
Всякий раз, когда вы пишете команду java в командной строке для запуска класса java, создается экземпляр JVM.
JVM-архитектура:
Давайте разберемся с внутренней архитектурой JVM. Он содержит загрузчик классов, область памяти, исполнительный механизм и т. д.
Загрузчик классов
Classloader — это подсистема JVM, которая используется для загрузки файлов классов. Всякий раз, когда мы запускаем программу Java, она сначала загружается загрузчиком классов. JVM имеет гибкую архитектуру загрузчика классов, которая позволяет приложению Java загружать классы настраиваемым образом, и каждый класс загружается некоторым экземпляром java.lang.ClassLoader. Если класс Java вызывается и должен быть выполнен на JVM, для поиска интересующего класса Java используется специальный компонент Java, называемый загрузчиком классов. Скомпилируйте этот файл в байт-код и выполните байт-код этого файла класса на JVM. В Java есть три встроенных загрузчика классов.
- Bootstrap ClassLoader: это первый загрузчик классов, который является надклассом загрузчика классов Extension. Он загружает файл rt.jar, который содержит все файлы классов Java Standard Edition, такие как классы пакетов java.lang, классы пакетов java.net, классы пакетов java.util, классы пакетов java.io. , классы пакета java.sql и т. д.
- Extension ClassLoader: это дочерний загрузчик классов Bootstrap и родительский загрузчик классов System. Он загружает файлы jar, расположенные в каталоге $JAVA_HOME/jre/lib/ext.
- System/Application ClassLoader: это дочерний загрузчик классов Extension classloader. Он загружает файлы классов из пути к классам. По умолчанию classpath установлен в текущий каталог. Вы можете изменить путь к классам с помощью переключателя "-cp" или "-classpath". Он также известен как загрузчик классов приложений.
1) Класс (метод) Область
В области класса (метода) хранятся структуры для каждого класса, такие как пул констант времени выполнения, данные полей и методов, код для методов. В области методов хранится вся информация уровня класса, такая как имя класса, имя непосредственного родительского класса, информация о методах и переменных и т. д., включая статические переменные. У каждой JVM есть только одна область методов, и это общий ресурс.
2) куча
Это область данных времени выполнения, в которой размещаются объекты. Куча — это место в памяти, где хранятся объекты и их переменная экземпляра. Каждый раз, когда объект создается в Java, он помещается в область памяти, известную как куча.
3) Стек
Java Stack хранит фреймы. Он содержит локальные переменные и частичные результаты, а также играет роль в вызове и возврате метода. Каждый поток имеет частный стек JVM, созданный одновременно с потоком. Для каждого потока JVM создает один стек времени выполнения, который хранится здесь. Каждый блок этого стека называется записью активации/кадром стека, в котором хранятся вызовы методов. Все локальные переменные этого метода хранятся в соответствующем фрейме. После завершения потока его стек времени выполнения будет уничтожен JVM. Это не общий ресурс.
4) Регистр счетчика программ
Регистр PC (программный счетчик) содержит адрес выполняемой в данный момент инструкции виртуальной машины Java.
5) Стек собственных методов
Он содержит все нативные методы, используемые в приложении. Нативные методы — это те, которые написаны на языках, отличных от Java. Он хранит информацию о собственном методе.
Исполнительный механизм
Это содержит:
- Сборщик мусора. Сборка мусора — это процесс, направленный на освобождение занятой памяти, на которую больше не ссылается какой-либо доступный объект Java, и является неотъемлемой частью системы управления динамической памятью JVM. Он отслеживал живые объекты, а все остальное обозначал как мусор.
- Интерпретатор: чтение потока байт-кода, затем выполнение инструкций. Он интерпретирует байт-код построчно и затем выполняется. Поскольку он интерпретирует и выполняет инструкции одну за другой, он может быстро интерпретировать один байт-код, но медленно выполняет интерпретируемый результат.
- Компилятор Just-In-Time (JIT): используется для повышения производительности. JIT одновременно компилирует части байт-кода, которые имеют сходную функциональность, и, следовательно, сокращает время, необходимое для компиляции. Здесь термин «компилятор» относится к транслятору из набора инструкций виртуальной машины Java (JVM) в набор инструкций конкретного процессора. Он компилирует весь байт-код и изменяет его на собственный код, поэтому всякий раз, когда интерпретатор видит повторяющиеся вызовы методов, JIT предоставляет прямой собственный код для этой части, поэтому повторная интерпретация не требуется, что повышает эффективность.
Собственный интерфейс Java
Java Native Interface (JNI) — это инфраструктура, которая предоставляет интерфейс для связи с другим приложением, написанным на другом языке, таком как C, C++, Assembly и т. д. Java использует инфраструктуру JNI для отправки вывода на консоль или взаимодействия с библиотеками ОС.
Нативные библиотеки Java
Нативные библиотеки — это набор нативных библиотек (C, C++), которые необходимы механизму выполнения.
Это знания, которые я узнал из книг и онлайн-сайтов.
Спасибо, что нашли время, чтобы прочитать этот пост.