Skip to content

Latest commit

 

History

History
255 lines (162 loc) · 10.6 KB

README.md

File metadata and controls

255 lines (162 loc) · 10.6 KB

JVM - краткая и поверхностная информация


Компиляция кода на Kotlin и Java

Kotlin и Java: общее

И Kotlin, и Java — это языки программирования, которые компилируются в байт-код для выполнения на JVM (Java Virtual Machine).

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

Процесс компиляции

  1. Исходный код
  • Kotlin: файлы с расширением .kt.
  • Java: файлы с расширением .java.
  1. Компиляция
  • Kotlin: Компилятор Kotlin (kotlinc) преобразует .kt файлы в байт-код (файлы .class).
  • Java: Компилятор Java (javac) преобразует .java файлы в байт-код (файлы .class).
  1. Байт-код
  • Байт-код — это промежуточный код, который может выполняться на JVM.
  • Файлы .class содержат инструкции для JVM.
  1. Выполнение на JVM
  • JVM интерпретирует байт-код и выполняет его на конкретной платформе (например, Windows, Linux, Android).

Пример компиляции Kotlin

kotlinc Hello.kt -include-runtime -d Hello.jar
  • Hello.kt — исходный файл.
  • Hello.jar — исполняемый файл, содержащий байт-код и необходимые библиотеки.

Пример компиляции Java

javac Hello.java
  • Hello.java — исходный файл.
  • Hello.class — файл с байт-кодом.

Как работает JVM (Java Virtual Machine)

JVM — это виртуальная машина, которая выполняет байт-код. Она обеспечивает платформонезависимость: один и тот же байт-код может выполняться на любой платформе, где установлена JVM.

Основные компоненты JVM:

Class Loader (Загрузчик классов):

  • Загружает классы (файлы .class) в память.
  • Проверяет корректность байт-кода.

Execution Engine (Исполняющий движок):

  • Интерпретирует байт-код и выполняет его.
  • Использует JIT (Just-In-Time) компиляцию для оптимизации производительности.

Memory Areas (Области памяти):

  • Method Area - Хранит метаданные классов (например, имена методов, поля).
  • Heap - Хранит объекты и массивы.
  • Stack - Хранит локальные переменные и вызовы методов.
  • PC Register - Хранит адрес текущей инструкции.
  • Native Method Stack - Для вызова нативных методов (например, написанных на C/C++).

Garbage Collector (Сборщик мусора):

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

Как JVM выполняет код?

  • Загрузка классов - Class Loader загружает .class файлы.
  • Верификация - Проверяет корректность байт-кода.
  • Интерпретация - Execution Engine интерпретирует байт-код.
  • JIT-компиляция - Часто используемые части кода компилируются в машинный код для ускорения выполнения.
  • Выполнение - Код выполняется на процессоре.

Файлы .class

  • Это файлы, содержащие байт-код, который может выполняться на JVM.
  • Они создаются компилятором Kotlin или Java.

Структура .class файла:

  • Magic Number - Уникальный идентификатор (0xCAFEBABE).
  • Version - Версия класса.
  • Constant Pool - Таблица констант (например, строки, имена методов).
  • Access Flags - Модификаторы доступа (например, public, final).
  • This Class - Имя текущего класса.
  • Super Class - Имя родительского класса.
  • Interfaces - Список интерфейсов.
  • Fields - Поля класса.
  • Methods - Методы класса.
  • Attributes - Дополнительные атрибуты (например, аннотации).

Как работает мобильное приложение на Android

Android и JVM

  • Android использует ART (Android Runtime) или Dalvik (в старых версиях) вместо стандартной JVM.
  • ART/Dalvik выполняет DEX-файлы (оптимизированный байт-код для Android).

Процесс работы приложения:

Компиляция:

  • Kotlin/Java код компилируется в .class файлы.
  • .class файлы преобразуются в DEX-файлы (Dalvik Executable) с помощью инструмента dx или d8.

Сборка APK:

  • DEX-файлы, ресурсы (изображения, строки) и манифест упаковываются в APK (Android Package).

Установка:

  • APK устанавливается на устройство.
  • ART/Dalvik компилирует DEX-файлы в нативный код (AOT-компиляция) или интерпретирует их (JIT-компиляция).

Запуск:

  • Приложение запускается в процессе Android.
  • ART/Dalvik выполняет код, управляет памятью и взаимодействует с системой.

Что такое APK?

APK (Android Package):

Это архивный файл, содержащий всё необходимое для работы приложения:

  • DEX-файлы - Скомпилированный код.
  • Ресурсы - Изображения, строки, макеты.
  • Манифест - AndroidManifest.xml (информация о приложении, разрешения, компоненты).
  • Нативные библиотеки - Библиотеки на C/C++ (если используются).

Структура APK:

  • classes.dex - Скомпилированный код.
  • res/ - Ресурсы (изображения, строки).
  • AndroidManifest.xml - Манифест приложения.
  • lib/ - Нативные библиотеки.
  • assets/ - Дополнительные файлы.

Как работает код на уровне процессора и памяти

Процессор и выполнение кода

  • Процессор выполняет машинный код (нативные инструкции).
  • JVM (или ART/Dalvik) преобразует байт-код в машинный код с помощью JIT или AOT компиляции.

Память: Стек (Stack) и Куча (Heap)

Стек (Stack):

  • Хранит локальные переменные и вызовы методов.
  • Каждый поток имеет свой стек.
  • Быстрый доступ, но ограниченный размер.

Куча (Heap):

  • Хранит объекты и массивы.
  • Общая для всех потоков.
  • Медленный доступ, но большой размер.

Пример работы стека и кучи:

public class Example {
    public static void main(String[] args) {
        int x = 10; // Локальная переменная (хранится в стеке)
        String str = new String("Hello"); // Объект (хранится в куче)
    }
}
  • x хранится в стеке.
  • str хранится в куче, а ссылка на него — в стеке.

Сборка мусора (Garbage Collection)

Сборщик мусора автоматически освобождает память, удаляя объекты, которые больше не используются.

  • Mark - Помечает все используемые объекты.
  • Sweep - Удаляет неиспользуемые объекты.
  • Compact - Уплотняет память, чтобы избежать фрагментации.

Нативные методы (Native Methods)

Нативные методы — это методы, написанные на других языках (например, C/C++), которые могут вызываться из Java/Kotlin кода.

public class NativeExample {
    public native void nativeMethod(); // Нативный метод

    static {
        System.loadLibrary("native-lib"); // Загрузка нативной библиотеки
    }
}

Краткое

Компиляция:

  • Kotlin/Java код компилируется в .class файлы.
  • .class файлы преобразуются в DEX-файлы для Android.

JVM:

  • Выполняет байт-код.
  • Состоит из Class Loader, Execution Engine, Memory Areas и Garbage Collector.

Android:

  • Использует ART/Dalvik для выполнения DEX-файлов.
  • APK — это архив с DEX-файлами, ресурсами и манифестом.

Память:

  • Стек - Локальные переменные и вызовы методов.
  • Куча - Объекты и массивы.

Сборка мусора:

  • Автоматически освобождает неиспользуемую память.