29/03/2024

Java Core

Java Core

Java Core

Что такое программа

Любая программа это набор инструкций, которые выполняет процессор или его микропрограмма. Эти инструкции называются машинным кодом. Они показывают процессору откуда взять данные, что с ними сделать и куда поожить результат. Hello world на машинном языке выглядел бы как набор цифр и букв, набор инструкций зависит от реализации конкретного процессора и унифицируется на уровне операционных систем(созданием виртуального процесора с универсальным набором инструкций).

Появление и развитие языка программирования

  1. Чтобы было проще запоминать машинные коды для каждого кода придумали мнемоники. Так появился язык Asembler и код стал немного понятнее.

  2. Затем появились языки высокого уровня которые оперируют простыми словами, а специальные программы - компеляторы и интерпретаторы приводили их в машинный код.

  3. Следующим этапом развития стало компиляция языка программирования не напрямую в машинный код, а сначала в промежуточный байт-код, по этому пути пошли разработчики java и dotNet'a.

  • Разработчики Java создали концепцию JVM - java virtual machine - виртуальная машина, которая может исполнять bytecode скомпелированный из java кода. Создав реализацию такой виртуальной машины для разных платформ, мы получили возможность писать на джаве для любой платформы.

  • Разработчики из дотнета пошли другим путем и создали clr - common language runtime если разработчики джава были сосредоточены только на языке джава, то clr был создан для возможности писать на разных языках в пределах одного решения но при этом все ставки делались только на windows.

В настоящее время обе команды пересмотрели свою концепцию: в jvm появилась поддержка в том числе и других языков, а для дот нета почвилась платформа Mono которая позволяет запускать C# практически на любом устройстве.

Что такое JVM?

JVM состоит из:

  • Class Loader, загружающего файлы с байт кодом в память;
  • виртуальная память, куда все это загружается;
  • движок, который исполняет и оптимизирует код;
  • дополнительные интерфейсы и библиотеки для работы с нативным кодом (кодом написанном на c/c++/assembler'e).

Class Loader

Различают 3 вида:

  • bootstrap - загружает все стандартные классы Java, т.е. все которые содержатся в пакетах java.lang, java.net и т.д.;
  • extension - загружает классы из дополнительных библиотек, которые стаятся вместе с jdk и jre;
  • application - загружает классы из  classpath папок, которые может настроить сам разработчик.

JVM Memory - виртуальная память

  • Method Area, metaspace - здесь хранятся все статичные структуры и сам код, эта область является частью Heap(кучи)
  • Heap - большая область памяти в которой хранятся все создаваемые объекты, она выделяется сразу при запуске и делится между всеми основными потоками. Здесь обычно происходят основные утечки память и здесь же работает garbage collector(уборщик мусора). GC - собирает информацию о данных которые больше не используются и пытается их удалить.
  • Stack - более емкая область памяти, которая создается при создании потока, у каждого потока свой стек. Стек устроен по принципу первый вошел последний вышел(FILO). Для каждого вызываемого метода в стеке создается frame, набор именнованных параметров которые хранит переменные созданные в этом методе, промежуточные результаты и итоговый результат который возвращается через return. После выполнения метода его фрейм извлекается из стека и происходит переход к фрейму метода который был положен в стек перед ним, те тот метод который вызывал данный метод.
  • PC Registers - содержат указатели на внутренние инструкции самой java.
  • Native Method Stack - стек для нативных методов.

Движок

  • JIT - just-in-time компилятор - оптимизирует уже скомпелированный байт код
  • Интерпретатор который исполняет скомпелированный байт код

JRE

JVM + java библиотеки

JDK

JRE + инструменты разработчика + компилятор