Статьи

Как строится Java / JVM?

Введение и история

Как некоторые из вас, возможно, уже знают, начиная с Java 7, OpenJDK является эталонной реализацией (RI) для Java. Приведенная ниже временная шкала дает представление об истории OpenJDK:

История OpenJDK (с 2006 года по настоящее время)

История OpenJDK (с 2006 года по настоящее время)

См. Adopt OpenJDK — прошлое, настоящее и будущее [1] для получения более подробной информации.

Если вы задались вопросом о бинарных файлах JDK или JRE, которые вы загружаете от таких поставщиков, как Oracle, Red Hat и т. Д., Значит, все это происходит из OpenJDK. Затем каждый поставщик добавляет дополнительные артефакты, которые еще не являются открытым исходным кодом по соображениям безопасности, проприетарной или другим причинам.

Из чего сделан OpenJDK?

OpenJDK состоит из нескольких репозиториев, а именно: corba, hotspot, jaxp, jaxws, jdk, langtools и nashorn. Между OpenjJDK8 и OpenJDK9 не было введено никаких новых репозиториев, но было много новых изменений и реструктуризации, в основном из-за Jigsaw — модульности самой Java [ 2 ] [ 3 ] [ 4 ] [ 5 ].

состав репо, разбивка по языкам (метрики оцениваются)

состав репо, разбивка по языкам (метрики оцениваются)

Как язык и платформа Java создавались за эти годы?

Java создается путем начальной загрузки более старой (предыдущей) версии Java, т. Е. Java создается с использованием самой Java в качестве своего строительного блока. Где старые компоненты собраны вместе, чтобы создать новый компонент, который на следующем этапе становится строительным блоком. Хороший пример начальной загрузки можно найти в Scheme from Scratch [6 ] или даже в Википедии [7] .

OpenJDK8 [8] компилируется и собирается с использованием JDK7, аналогично OpenJDK9 [9] компилируется и собирается с использованием JDK8. Теоретически OpenJDK8 может быть скомпилирован с использованием изображений, созданных из OpenJDK8, аналогично OpenJDK9 с использованием OpenJDK9. Используя процесс, называемый образами загрузочного цикла, создается JDK-образ OpenJDK, а затем с использованием того же образа OpenJDK снова компилируется, что можно сделать с помощью параметра команды make:

$ make bootcycle-images # Build images twice, second time with newly built JDK

make предлагает ряд опций в OpenJDK8 и OpenJDK9, вы можете создавать отдельные компоненты или модули, называя их, т.е.

$ make [component-name] | [module-name]

или даже запустить несколько процессов сборки параллельно, т.е.

$ make JOBS=<n> # Run <n> parallel make jobs

Наконец, установите встроенный артефакт, используя опцию установки, т.е.

$ make install

Некоторые мифы разрушены

OpenJDK или Hotspot, если быть более конкретным, не полностью написаны на C / C ++, хорошая часть кодовой базы — это хороший Java (см. Рисунок композиции выше). Так что вам не нужно быть заядлым разработчиком, чтобы внести свой вклад в Open JDK. Даже базовая кодовая база C / C ++ не страшна и не устрашительна. Например, вот фрагмент кода из vm / memory / universe.cpp
в HotSpotrepo — http://hg.openjdk.java.net/jdk6/jdk6/hotspot/raw-file/a541ca8fa0e3/src/share/vm/memory/universe.cpp [10]:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.
.
.
Universe::initialize_heap()
 
if (UseParallelGC) {
    #ifndef SERIALGC
    Universe::_collectedHeap = new ParallelScavengeHeap();
    #else // SERIALGC
        fatal("UseParallelGC not supported in this VM.");
    #endif // SERIALGC
 
} else if (UseG1GC) {
    #ifndef SERIALGC
    G1CollectorPolicy* g1p = new G1CollectorPolicy();
    G1CollectedHeap* g1h = new G1CollectedHeap(g1p);
    Universe::_collectedHeap = g1h;
    #else // SERIALGC
        fatal("UseG1GC not supported in java kernel vm.");
    #endif // SERIALGC
 
} else {
    GenCollectorPolicy* gc_policy;
 
    if (UseSerialGC) {
        gc_policy = new MarkSweepPolicy();
    } else if (UseConcMarkSweepGC) {
        #ifndef SERIALGC
        if (UseAdaptiveSizePolicy) {
            gc_policy = new ASConcurrentMarkSweepPolicy();
        } else {
            gc_policy = new ConcurrentMarkSweepPolicy();
        }
        #else // SERIALGC
            fatal("UseConcMarkSweepGC not supported in this VM.");
        #endif // SERIALGC
    } else { // default old generation
        gc_policy = new MarkSweepPolicy();
    }
 
    Universe::_collectedHeap = new GenCollectedHeap(gc_policy);
}
.
.
.

(обратите внимание, что приведенный выше фрагмент кода мог измениться после публикации здесь)
Из приведенного выше кодового блока ясно, что мы смотрим, как прекомпиляционные нотации используются для создания кода Hotspot, который поддерживает определенный тип GC, т.е. Serial GC или Parallel GC. Кроме того, тип политики GC выбирается в приведенном выше блоке кода, когда один или несколько переключателей GC переключаются, т. Е. UseAdaptiveSizePolicy, когда включено, выбирает политику асинхронной одновременной метки и развертки . В случае использования Use Serial GC или Use Concurrent Mark Sweep GC не выбран, тогда выбранная политика GC — Mark and Sweep policy. Все это и многое другое довольно четко читается и многословно, а не просто красиво отформатированный код, который читается как английский.

Дальнейшие комментарии можно найти в разделе, озаглавленном «Горячие точки глубокого погружения» в документе Adopt OpenJDK Intermediate & Advance experience [11].

Шаги, чтобы построить свой собственный JDK или JRE

Ранее мы упоминали об изображениях JDK и JRE — они больше не доступны только крупным игрокам в мире Java, вы и я можем очень легко создавать такие изображения. Шаги для этого процесса были упрощены, и для быстрого начала см. Документы Adopt OpenJDK Getting Started Kit [12] и Adopt OpenJDK Intermediate & Advance [11]. Подробную версию этих шагов вы можете найти на домашней странице Adopt OpenJDK [13]. По сути, создание образа JDK из базы кода OpenJDK сводится к следующим командам:
(шаги настройки сделаны краткими, а некоторые команды опущены, точные шаги см. по ссылкам выше)

$ hg clone http://hg.openjdk.java.net/jdk8/jdk8 jdk8 (a)...OpenJDK8

или же

$ hg clone http://hg.openjdk.java.net/jdk9/jdk9 jdk9 (a)...OpenJDK9

$ ./get_sources.sh (b)

$ bash configure (c)

$ make clean images (d)

(шаги настройки сделаны краткими, а некоторые команды опущены, точные шаги см. по ссылкам выше)

Чтобы объяснить, что происходит на каждом из шагов выше:

(a) Мы клонируем openjdk Mercurial Repo так же, как мы использовали бы git clone…

(b) Как только мы выполним шаг (а), мы перейдем в созданную папку и запустим команду get_sources.sh, которая эквивалентна git fetch или git pull, так как шаг (a) выводит только базовые файлы и не все файлы и папки.

(c) Здесь мы запускаем скрипт, который проверяет и создает конфигурацию, необходимую для выполнения процесса компиляции и сборки.

(d) После выполнения шага (c) мы выполняем полную компиляцию, сборку и создание образов JDK и JRE из созданных артефактов.

Как вы можете видеть, это очень простые шаги для создания артефакта или изображений JDK / JRE [шаг (a) должен быть выполнен только один раз).

Выгоды

  • способствовать развитию и совершенствованию языка и платформы Java
  • узнать о внутренностях языка и платформы
  • узнать о платформе ОС и других технологиях, делая то же самое
  • участвовать в проектах F / OSS
  • Будьте в курсе последних изменений в сфере Java / JVM
  • знания и опыт, которые помогают профессионально, но они также не доступны из других источников (например, книги, обучение, опыт работы, университетские курсы и т. д.)
  • продвижение в карьере
  • личностное развитие (мягкие навыки и общение)

Способствовать

Присоединяйтесь к проектам Adopt OpenJDK [14] и Betterrev [15] и делитесь своим мнением обо всем, что касается Java, включая эти проекты. Для начала присоединитесь к списку рассылки Adoption Discuss и другим спискам рассылки, связанным с OpenJDK, они будут держать вас в курсе последних достижений и изменений в OpenJDK. Создайте любой из проектов, которые вы видите, и отправьте изменения через pull-запросы.

Спасибо и поддержка

Принятие OpenJDK [14] и зонтичных проектов поддерживались и развивались с помощью JCP [21], команды Openjdk [22], JUG, таких как London Java Community [16], SouJava [17] и других JUG в Бразилии, ряда Кувшины в Европе, например, BGJUG (болгарский кувшин) [18], BeJUG (бельгийский кувшин) [19], македонский кувшин [20] и ряд других небольших кувшинов. Мы надеемся, что в ближайшее время будет задействовано больше кувшинов и отдельных лиц. Если вы или ваш JUG хотите участвовать, пожалуйста, свяжитесь с нами.