diff --git a/build/j-spec.pdf b/build/j-spec.pdf index e190b1f..03f308a 100644 Binary files a/build/j-spec.pdf and b/build/j-spec.pdf differ diff --git a/j-spec.tex b/j-spec.tex index 9573d42..6ec3831 100644 --- a/j-spec.tex +++ b/j-spec.tex @@ -17,6 +17,7 @@ \usepackage{tikz} \usepackage{hyperref} \usetikzlibrary{mindmap,trees} +\input{fancy-listings-preamble} \titlelabel{\thetitle. \quad} \setcounter{tocdepth}{1} @@ -62,7 +63,7 @@ bottom=2cm } -\title{ТЗ на "Специализацию Java"} +\title{Специализация Java} \author{Иван Игоревич Овчинников} \date{\today{} (\DTMcurrenttime)} @@ -125,33 +126,59 @@ TL;DR: Как именно всё работает? Если коротко, то слой за слоем накладывая абстракции. Программы на любом языке программирования исполняются на компьютере, то есть, так или иначе, задействуют процессор, оперативную память и прочие аппаратурные компоненты. Эти аппаратурные компоненты предоставляют для доступа к себе низкоуровневые интерфейсы, которые задействует операционная система, предоставляя в свою очередь интерфейс чуть проще программам, взаимодействующим с ней. Этот интерфейс взаимодействия с ОС мы для простоты будем называть Native API. -С ОС взаимодействует JVM, то есть, используя Native API, нам становится всё равно, какая именно ОС установлена на компьютере, главное уметь выполняться на JVM. Это открывает простор для создания целой группы языков, они носят общее бытовое название JVM-языки, к ним относят Scala, Groovy, Kotlin и другие. Внутри JVM осуществляется управление памятью, существует механизм исполнения программ, специальный JIT\footnote{JIT, just-in-time - англ. в\'{о}время, прямо сейчас}-компилятор. +С ОС взаимодействует JVM, то есть, используя Native API, нам становится всё равно, какая именно ОС установлена на компьютере, главное уметь выполняться на JVM. Это открывает простор для создания целой группы языков, они носят общее бытовое название JVM-языки, к ним относят Scala, Groovy, Kotlin и другие. Внутри JVM осуществляется управление памятью, существует механизм исполнения программ, специальный JIT\footnote{JIT, just-in-time - англ. в\'{о}время, прямо сейчас}-компилятор, генерирующий платформенно-зависимый код. -% далее тут надо подробнее расписать ЖВМ +JVM для своей работы запрашивает у ОС некоторый сегмент оперативной памяти, в котором хранит данные программы. Это хранение происходит «слоями»: +\begin{enumerate} +\item Eden Space (heap) – в этой области выделятся память под все создаваемые из программы объекты. Большая часть объектов живёт недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), сборщик мусора выполняет быструю (minor collection) сборку. По сравнению с полной сборкой, она занимает мало времени, и затрагивает только эту область памяти, а именно, очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область. +\item Survivor Space (heap) – сюда перемещаются объекты из предыдущей области после того, как они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space. +\item Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и прочие). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты. +\item Permanent Generation (non-heap) – Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.). +\item Code Cache (non-heap) — эта область используется JVM, когда включена JIT-компиляция, в ней кешируется скомпилированный платформенно-зависимый код. +\end{enumerate} -На пользовательском уровне важно не только исполнять программы, но чтобы эти программы умели как-то взаимодействовать с другими программами и другими аспектами внешнего мира, поэтому JVM интегрирована в JRE - Java Runtime Environment. JRE - это набор из классов и интерфейсов, осуществляющих взаимодействия с +JVM самостоятельно осуществляет сборку так называемого мусора, что значительно облегчает работу программиста по отслеживанию утечек памяти, но важно помнить, что в Java утечки памяти всё равно существуют, особенно при программировании многопоточных приложений. -В таблице \hrf{table:jdk-contents}, приведена примерная структура и состав JDK, а также указаны основные и наиболее часто используемые компоненты. +\begin{figure}[H] + \centering + \def\svgwidth{150mm} + \input{pics/jc-01-jvm-struct.pdf_tex} + \label{jvm:structure} + \caption{принцип работы JVM} +\end{figure} -\begin{table} +На пользовательском уровне важно не только исполнять базовые инструкции программы, но чтобы эти базовые инструкции умели как-то взаимодействовать со внешним миром, в том числе другими программами, поэтому JVM интегрирована в JRE - Java Runtime Environment. JRE - это набор из классов и интерфейсов, реализующих +\begin{itemize} +\item возможности сетевого взаимодействия; +\item рисование графики и графический пользовательский интерфейс; +\item мультимедиа; +\item математический аппарат; +\item наследование и полиморфизм; +\item рефлексию; +\item ... многое другое. +\end{itemize} + +Java Development Kit является изрядно дополненным специальными Java приложениями SDK. JDK дополняет JRE не только утилитами для компиляции, но и утилитами для создания документации, отладки, развёртывания приложений и многими другими. В таблице \ref{table:jdk-contents} на странице \pageref{table:jdk-contents}, приведена примерная структура и состав JDK и JRE, а также указаны их основные и наиболее часто используемые компоненты из состава Java Standard Edition. Помимо стандартной редакции существует и Enterprise Edition, содержащий компоненты для создания веб-приложений, но JEE активно вытесняется фреймворками Spring и Spring Boot. + +\begin{table}[H] \centering \begin{adjustbox}{angle=90} \begin{tabular}{|l|ll|llllllll|} \cline{1-1} \cline{4-11} \multirow{15}{*}{\rotatebox[origin=c]{270}{Java Development Kit }} & & & \multicolumn{8}{l|}{Language} \\ \cline{4-11} - & & & \multicolumn{1}{l|}{\multirow{3}{25mm}{tools + tools api}} & \multicolumn{1}{l|}{javac} & \multicolumn{1}{l|}{java} & \multicolumn{1}{l|}{javadoc} & \multicolumn{1}{l|}{javap} & \multicolumn{1}{l|}{jar} & \multicolumn{2}{l|}{JPDA} \\ \cline{5-11} - & & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{JConsole} & \multicolumn{1}{p{25mm}|}{JavaVisualVM} & \multicolumn{1}{l|}{JMC} & \multicolumn{1}{l|}{JFR} & \multicolumn{1}{l|}{Java DB} & \multicolumn{1}{l|}{Int'l} & JVM TI \\ \cline{5-11} - & & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{IDL} & \multicolumn{1}{l|}{Troubleshoot} & \multicolumn{1}{l|}{Security} & \multicolumn{1}{l|}{Deploy} & \multicolumn{1}{l|}{Scripting} & \multicolumn{1}{l|}{Web services} & RMI \\ \cline{2-2} \cline{4-11} + & & & \multicolumn{1}{l|}{\multirow{3}{23mm}{tools + tools api}} & \multicolumn{1}{l|}{javac} & \multicolumn{1}{l|}{java} & \multicolumn{1}{l|}{javadoc} & \multicolumn{1}{l|}{javap} & \multicolumn{1}{l|}{jar} & \multicolumn{2}{l|}{JPDA} \\ \cline{5-11} + & & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{JConsole} & \multicolumn{1}{p{23mm}|}{JavaVisualVM} & \multicolumn{1}{l|}{JMC} & \multicolumn{1}{l|}{JFR} & \multicolumn{1}{l|}{Java DB} & \multicolumn{1}{l|}{Int'l} & JVM TI \\ \cline{5-11} + & & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{IDL} & \multicolumn{1}{l|}{Troubleshoot} & \multicolumn{1}{l|}{Security} & \multicolumn{1}{l|}{RMI} & \multicolumn{1}{l|}{Scripting} & \multicolumn{1}{l|}{Web services} & Deploy \\ \cline{2-2} \cline{4-11} & \multicolumn{1}{l|}{\multirow{11}{*}{\rotatebox[origin=c]{270}{Java Runtime Environment }}} & & \multicolumn{1}{l|}{deployment} & \multicolumn{4}{l|}{Java Web} & \multicolumn{3}{l|}{Applet/Java plug-in} \\ \cline{3-11} & \multicolumn{1}{l|}{} & \multirow{10}{*}{\rotatebox[origin=c]{270}{Java Standard Edition }} & \multicolumn{1}{l|}{\multirow{2}{*}{UI toolkit}} & \multicolumn{2}{l|}{Swing} & \multicolumn{2}{l|}{Java 2D} & \multicolumn{1}{l|}{AWT} & \multicolumn{2}{l|}{Accessibility} \\ \cline{5-11} & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{Drag'n'Drop} & \multicolumn{2}{l|}{Input Methods} & \multicolumn{1}{l|}{Image I/O} & \multicolumn{1}{l|}{Print Service} & Sound \\ \cline{4-11} - & \multicolumn{1}{l|}{} & & \multicolumn{1}{p{25mm}|}{Integration libraries} & \multicolumn{1}{l|}{IDL} & \multicolumn{1}{l|}{JDBC} & \multicolumn{1}{l|}{JNDI} & \multicolumn{1}{l|}{RMI} & \multicolumn{1}{l|}{RMI-IIOP} & \multicolumn{2}{l|}{Scripting} \\ \cline{4-11} - & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{\multirow{3}{25mm}{Other base libraries}} & \multicolumn{2}{l|}{Override Mechanism} & \multicolumn{2}{l|}{Intl Support} & \multicolumn{2}{l|}{Input/Output} & JMX \\ \cline{5-11} + & \multicolumn{1}{l|}{} & & \multicolumn{1}{p{23mm}|}{Integration libraries} & \multicolumn{1}{l|}{IDL} & \multicolumn{1}{l|}{JDBC} & \multicolumn{1}{l|}{JNDI} & \multicolumn{1}{l|}{RMI} & \multicolumn{1}{l|}{RMI-IIOP} & \multicolumn{2}{l|}{Scripting} \\ \cline{4-11} + & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{\multirow{3}{23mm}{Other base libraries}} & \multicolumn{2}{l|}{Override Mechanism} & \multicolumn{2}{l|}{Intl Support} & \multicolumn{2}{l|}{Input/Output} & JMX \\ \cline{5-11} & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{XML JAXP} & \multicolumn{2}{l|}{Math} & \multicolumn{2}{l|}{Networking} & Beans \\ \cline{5-11} & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{2}{l|}{Security} & \multicolumn{2}{l|}{Serialization} & \multicolumn{2}{l|}{Extension Mechanism} & JNI \\ \cline{4-11} - & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{\multirow{3}{25mm}{Java lang and util base libs}} & \multicolumn{1}{l|}{JAR} & \multicolumn{1}{l|}{Lang and util} & \multicolumn{2}{l|}{Ref Objects} & \multicolumn{2}{l|}{Preference API} & Reflection \\ \cline{5-11} + & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{\multirow{3}{23mm}{Java lang and util base libs}} & \multicolumn{1}{l|}{JAR} & \multicolumn{1}{l|}{Lang and util} & \multicolumn{2}{l|}{Ref Objects} & \multicolumn{2}{l|}{Preference API} & Reflection \\ \cline{5-11} & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{Zip} & \multicolumn{1}{l|}{Management} & \multicolumn{2}{l|}{Instrumentation} & \multicolumn{2}{l|}{Stream API} & Collections \\ \cline{5-11} - & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{Logging} & \multicolumn{1}{p{25mm}|}{Regular Expressions} & \multicolumn{2}{l|}{Concurrency Utilities} & \multicolumn{2}{l|}{Datetime} & Versioning \\ \cline{4-11} + & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{Logging} & \multicolumn{1}{p{23mm}|}{Regular Expressions} & \multicolumn{2}{p{23mm}|}{Concurrency Utilities} & \multicolumn{2}{l|}{Datetime} & Versioning \\ \cline{4-11} & \multicolumn{1}{l|}{} & & \multicolumn{1}{l|}{JVM} & \multicolumn{7}{l|}{Java Hot Spot VM (JIT)} \\ \hline \end{tabular} \end{adjustbox} @@ -159,8 +186,33 @@ TL;DR: \caption{Общее представление состава JDK} \end{table} - \subsubsection{Структура проекта (пакеты, классы, метод main, комментарии)} +Проекты могут быть любой сложности. Часто структуру проекта задаёт сборщик проекта, предписывая в каких папках будут храниться исходные коды, исполняемые файлы, ресурсы и документация. Без их использования необходимо задать структуру самостоятельно. + +\textbf{Простейший проект} состоит из файла исходного кода, который возможно скомпилировать и запустить как самостоятельный объект. + +Файл \code{Main.java} в этом случае может иметь следующий, минималистичный вид +\begin{lstlisting}[language=Java,style=JCodeStyle] +public class Main { + public static void main(String[] args) { + System.out.println("Hello, world!"); + } +} +\end{lstlisting} + +А скомпилировать и запустить его возможно без использования тяжеловесных сред разработки, введя в командной строке ОС две команды. +\begin{lstlisting}[style=ASMStyle] +ivan-igorevich@gb sources % ls +Main.java +ivan-igorevich@gb sources % javac Main.java +ivan-igorevich@gb sources % ls +Main.class Main.java +ivan-igorevich@gb sources % java Main +Hello, world! +\end{lstlisting} + +\textbf{Обычный проект} состоит из пакетов, которые содержат классы, которые в свою очередь как-то связаны между собой и содержат код, который исполняется. + \subsubsection{Отложим мышки в сторону (CLI: сборка, пакеты, запуск)} \subsubsection{Документирование (Javadoc)} diff --git a/pdfit.sh b/pdfit.sh new file mode 100755 index 0000000..d6cb3b3 --- /dev/null +++ b/pdfit.sh @@ -0,0 +1,2 @@ +#!/bin/sh +inkscape -D --export-filename=$1.pdf $1.svg --export-latex diff --git a/pics/jc-01-jvm-struct.pdf b/pics/jc-01-jvm-struct.pdf new file mode 100644 index 0000000..9149415 Binary files /dev/null and b/pics/jc-01-jvm-struct.pdf differ diff --git a/pics/jc-01-jvm-struct.pdf_tex b/pics/jc-01-jvm-struct.pdf_tex new file mode 100644 index 0000000..e742e47 --- /dev/null +++ b/pics/jc-01-jvm-struct.pdf_tex @@ -0,0 +1,72 @@ +%% Creator: Inkscape 1.2.1 (9c6d41e4, 2022-07-14), www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'jc-01-jvm-struct.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{.pdf_tex} +%% instead of +%% \includegraphics{.pdf} +%% To scale the image, write +%% \def\svgwidth{} +%% \input{.pdf_tex} +%% instead of +%% \includegraphics[width=]{.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{}{.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{454.38705274bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.5009936)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0.06916666,0.46132088){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}java class file\end{tabular}}}}% + \put(0.39718652,0.46004457){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}class loader\end{tabular}}}}% + \put(0.09642891,0.28703679){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}method area\end{tabular}}}}% + \put(0.33301305,0.289553){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}heap\end{tabular}}}}% + \put(0.48336439,0.28803519){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}stack\end{tabular}}}}% + \put(0.62945634,0.28949846){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}java threads\end{tabular}}}}% + \put(0.45303332,0.22870609){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}program counter registers\end{tabular}}}}% + \put(0.11399044,0.22582811){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}native internal threads\end{tabular}}}}% + \put(0.14578059,0.08937075){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}execution engine\end{tabular}}}}% + \put(0.04586328,0.03933318){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}JIT compiler\end{tabular}}}}% + \put(0.25246764,0.04017086){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}garbage collector\end{tabular}}}}% + \put(0.56858297,0.07679544){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}native method\\interface\end{tabular}}}}% + \put(0.81836891,0.07711185){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}native method\\library\end{tabular}}}}% + \put(0.33286659,0.34367195){\color[rgb]{0,0,0}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}runtime data area\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{jc-01-jvm-struct.pdf}}% + \end{picture}% +\endgroup% diff --git a/pics/jc-01-jvm-struct.svg b/pics/jc-01-jvm-struct.svg new file mode 100644 index 0000000..f8da631 --- /dev/null +++ b/pics/jc-01-jvm-struct.svg @@ -0,0 +1,432 @@ + + + + + + + + + + + + + + + + + + + + java class file + + class loader + method area + heap + stack + java threads + program counter registers + native internal threads + execution engine + JIT compiler + garbage collector + native methodinterface + native methodlibrary + runtime data area + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scenarios/build/jc-1-b.pdf b/scenarios/build/jc-1-b.pdf index d2e04df..16b9fa6 100644 Binary files a/scenarios/build/jc-1-b.pdf and b/scenarios/build/jc-1-b.pdf differ diff --git a/scenarios/build/jc-1-c.pdf b/scenarios/build/jc-1-c.pdf index 352d5b1..28147de 100644 Binary files a/scenarios/build/jc-1-c.pdf and b/scenarios/build/jc-1-c.pdf differ diff --git a/scenarios/jc-1-b.tex b/scenarios/jc-1-b.tex index 31ee2f7..ed9c6ae 100644 --- a/scenarios/jc-1-b.tex +++ b/scenarios/jc-1-b.tex @@ -113,11 +113,23 @@ \begin{frame} \frametitle{JDK и его друзья} + TL;DR: +\begin{itemize} +\item JDK = JRE + инструменты разработчика; +\item JRE = JVM + библиотеки классов; +\item JVM = Native API + механизм исполнения + управление памятью. +\end{itemize} \end{frame} \note{...} \begin{frame} \frametitle{JVM и что в нём происходит} + рис 1.2 (стр 4) конспекта +\end{frame} +\note{...} + +\begin{frame} + \frametitle{Структура проекта} \end{frame} \note{...} @@ -126,5 +138,4 @@ \end{frame} \note{...} - \end{document} \ No newline at end of file diff --git a/scenarios/jc-1-c.tex b/scenarios/jc-1-c.tex index c6119f4..e0e4cdc 100644 --- a/scenarios/jc-1-c.tex +++ b/scenarios/jc-1-c.tex @@ -63,6 +63,11 @@ Всё, что разрабатывает разработчик, исполняется в специальной среде это среда является частью JDK и позволяет исполнять все программы написанные разработчиками на конечном в компьютере. Именно эта среда и устанавливается на компьютере пользователя чтобы пользователь мог запускать приложения, написанные на языке Java. Итак, самая необходимая вещь для любого пользователя это JRE. Это аббревиатура расшифровывается как Java Runtime Environment, то есть среда исполнения программ на языке Java. Она содержит в себе основной внутренний механизм который называется Java virtual machine и библиотеку из разных классов чтобы эта виртуальная машина хорошо работала умела показывать пользователю строки осуществлять ввод-вывод фреймворк коллекций и прочее, тут тоже есть куча интересных аббревиатур, которые мы так или иначе изучим, например, Java native interface, Java database connectivity и другие. Если копнуть ещё чуть глубже, можно и JRE разделить на JSE и JEE, но нас это деление пока не очень интересует, оно произойдёт естественным образом на более старших курсах. Пока что всё, что мы будем изучать, это JSE. -Инструментарий разработчика мы будем так или иначе рассматривать весь оставшийся курс, части среды исполнения мы тоже будем всесторонне изучать на последующих уроках сейчас хотелось бы подробнее остановиться на виртуальной машине Java поскольку понимание того как она устроена должно значительно облегчить для вас понимание процесса исполнения программы и как следствие процесс разработки этих самых программ. Виртуальная машина Java осуществляет загрузку классов программы в некую оперативную память здесь имеется ввиду не оперативная память как аппаратное часть компьютера а некая выделенная часть этой оперативной памяти который с нами поделилось операционная система также осуществляется управление памятью а именно очистка и сборка мусора и непосредственное исполнение классов нашего приложения путём Компиляции методов из промежуточного байткода в непосредственные вызовы операционной системы или другого исполнителя то есть грубо говоря преобразования классов джавы в ассемблерный код конкретного компьютера jit компиляция. Существуют разные Реализация виртуальных машин (https://ru.m.wikipedia.org/wiki/Список_виртуальных_машин_Java) даже экзотические, например мультиязыковой интерпретатор GraalVM. по большей части виртуальные машины отличаются как раз вот этой частью с just In time Компиляцией то есть с преобразованием методов в непосредственные машинные вызовы в реальном времени. чем быстрее происходит эта just In time Компиляция тем соответственно быстрее работает приложение. +% ----------------------------------------------------------------------------------- +\showslide{build/jc-1-b.pdf} +Инструментарий разработчика мы будем так или иначе рассматривать весь оставшийся курс, части среды исполнения мы тоже будем всесторонне изучать на последующих уроках. Сейчас хотелось бы подробнее остановиться на виртуальной машине Java, поскольку понимание того, как она устроена, должно значительно облегчить для вас понимание процесса исполнения программы и, как следствие, процесс разработки этих самых программ. Виртуальная машина Java осуществляет загрузку классов программы в оперативную память, причём здесь имеется ввиду не оперативная память как аппаратная часть компьютера, а некая выделенная часть этой оперативной памяти, которой с нами поделилось операционная система. Также осуществляется управление памятью, а именно очистка и сборка мусора и непосредственное исполнение классов нашего приложения, путём компиляции методов из промежуточного байткода в непосредственные вызовы операционной системы или другого исполнителя, то есть грубо говоря преобразования классов Java в ассемблерный код конкретного компьютера. Этот процесс называется JIT компиляция. Существуют разные Реализация виртуальных машин (\href{https://ru.m.wikipedia.org/wiki/Список_виртуальных_машин_Java}{Wikipedia: Список виртуальных машин Java}), даже экзотические, например мультиязыковой интерпретатор GraalVM. По большей части виртуальные машины отличаются как раз этой частью, с Just In Time компиляцией, то есть с преобразованием методов в непосредственные машинные вызовы в реальном времени. Чем быстрее происходит эта JIT компиляция, тем, соответственно, быстрее работает приложение на виртуальной машине. JVM самостоятельно осуществляет сборку так называемого мусора, что значительно облегчает работу программиста по отслеживанию утечек памяти, но, на мой взгляд, не способствует должной концентрации внимания программиста на этом вопросе. Важно помнить, что в Java утечки памяти всё равно существуют, особенно при программировании многопоточных приложений. + +% ----------------------------------------------------------------------------------- +\showslide{build/jc-1-b.pdf} \end{document} \ No newline at end of file