ch1-sec1: 4 of 7 subsec ready
This commit is contained in:
parent
8205100db6
commit
3f99a20f40
BIN
build/j-spec.pdf
BIN
build/j-spec.pdf
Binary file not shown.
80
j-spec.tex
80
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)}
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/sh
|
||||
inkscape -D --export-filename=$1.pdf $1.svg --export-latex
|
Binary file not shown.
|
@ -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{<filename>.pdf_tex}
|
||||
%% instead of
|
||||
%% \includegraphics{<filename>.pdf}
|
||||
%% To scale the image, write
|
||||
%% \def\svgwidth{<desired width>}
|
||||
%% \input{<filename>.pdf_tex}
|
||||
%% instead of
|
||||
%% \includegraphics[width=<desired width>]{<filename>.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{<path to file>}{<filename>.pdf_tex}
|
||||
%% Alternatively, one can specify
|
||||
%% \graphicspath{{<path to file>/}}
|
||||
%%
|
||||
%% 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%
|
|
@ -0,0 +1,432 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
viewBox="0 0 210 297"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.2.1 (9c6d41e4, 2022-07-14)"
|
||||
sodipodi:docname="jc-01-jvm-struct.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#ffffff"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="true"
|
||||
showborder="false"
|
||||
borderlayer="false"
|
||||
inkscape:zoom="4.7716722"
|
||||
inkscape:cx="596.5414"
|
||||
inkscape:cy="592.66435"
|
||||
inkscape:window-width="1534"
|
||||
inkscape:window-height="922"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="layer1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid12999"
|
||||
units="mm"
|
||||
spacingx="1"
|
||||
spacingy="1"
|
||||
empspacing="5"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs2">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker13777"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="TriangleStart"
|
||||
markerWidth="5.3244081"
|
||||
markerHeight="6.155385"
|
||||
viewBox="0 0 5.3244081 6.1553851"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
transform="scale(0.5)"
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
|
||||
d="M 5.77,0 -2.88,5 V -5 Z"
|
||||
id="path13775" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker13729"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="TriangleStart"
|
||||
markerWidth="5.3244081"
|
||||
markerHeight="6.155385"
|
||||
viewBox="0 0 5.3244081 6.1553851"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
transform="scale(0.5)"
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
|
||||
d="M 5.77,0 -2.88,5 V -5 Z"
|
||||
id="path13727" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="TriangleStart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="TriangleStart"
|
||||
markerWidth="5.3244081"
|
||||
markerHeight="6.155385"
|
||||
viewBox="0 0 5.3244081 6.1553851"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
transform="scale(0.5)"
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
|
||||
d="M 5.77,0 -2.88,5 V -5 Z"
|
||||
id="path135" />
|
||||
</marker>
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Слой 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="60.956562"
|
||||
y="96.191261"
|
||||
id="text790"><tspan
|
||||
sodipodi:role="line"
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.265;stroke-opacity:1"
|
||||
x="60.956562"
|
||||
y="96.191261"
|
||||
id="tspan11908">java class file</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="68.165955"
|
||||
y="124.11515"
|
||||
id="text844"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan842"
|
||||
style="stroke-width:0.265"
|
||||
x="68.165955"
|
||||
y="124.11515" /></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="113.53738"
|
||||
y="96.395851"
|
||||
id="text848"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan846"
|
||||
style="stroke-width:0.265"
|
||||
x="113.53738"
|
||||
y="96.395851">class loader</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="65.326637"
|
||||
y="124.12859"
|
||||
id="text2304"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2302"
|
||||
style="stroke-width:0.265"
|
||||
x="65.326637"
|
||||
y="124.12859">method area</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="103.25052"
|
||||
y="123.72525"
|
||||
id="text3034"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3032"
|
||||
style="stroke-width:0.265"
|
||||
x="103.25052"
|
||||
y="123.72525">heap</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="127.35149"
|
||||
y="123.96855"
|
||||
id="text3038"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3036"
|
||||
style="stroke-width:0.265"
|
||||
x="127.35149"
|
||||
y="123.96855">stack</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="150.76968"
|
||||
y="123.73399"
|
||||
id="text3768"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3766"
|
||||
style="stroke-width:0.265"
|
||||
x="150.76968"
|
||||
y="123.73399">java threads</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="122.48949"
|
||||
y="133.47887"
|
||||
id="text4498"><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.265"
|
||||
x="122.48949"
|
||||
y="133.47887"
|
||||
id="tspan4500">program counter registers</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="68.141708"
|
||||
y="133.9402"
|
||||
id="text5230"><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.265"
|
||||
x="68.141708"
|
||||
y="133.9402"
|
||||
id="tspan5232">native internal threads</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="73.237595"
|
||||
y="155.814"
|
||||
id="text5962"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan5960"
|
||||
style="stroke-width:0.265"
|
||||
x="73.237595"
|
||||
y="155.814">execution engine</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="57.221085"
|
||||
y="163.8349"
|
||||
id="text6329"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan6327"
|
||||
style="stroke-width:0.265"
|
||||
x="57.221085"
|
||||
y="163.8349">JIT compiler</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="90.339279"
|
||||
y="163.70062"
|
||||
id="text7422"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan7420"
|
||||
style="stroke-width:0.265"
|
||||
x="90.339279"
|
||||
y="163.70062">garbage collector</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="141.01183"
|
||||
y="157.82979"
|
||||
id="text8152"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan8150"
|
||||
style="stroke-width:0.265"
|
||||
x="141.01183"
|
||||
y="157.82979">native method</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.265"
|
||||
x="141.01183"
|
||||
y="164.00342"
|
||||
id="tspan8154">interface</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="181.05193"
|
||||
y="157.77907"
|
||||
id="text8884"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan8882"
|
||||
style="stroke-width:0.265"
|
||||
x="181.05193"
|
||||
y="157.77907">native method</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
style="stroke-width:0.265"
|
||||
x="181.05193"
|
||||
y="163.9527"
|
||||
id="tspan8886">library</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="103.22704"
|
||||
y="115.05011"
|
||||
id="text10342"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan10340"
|
||||
style="stroke-width:0.265"
|
||||
x="103.22704"
|
||||
y="115.05011">runtime data area</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:4.9389px;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264999;stroke-opacity:1"
|
||||
x="134.56136"
|
||||
y="87.641937"
|
||||
id="text11072"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan11070"
|
||||
style="stroke-width:0.265"
|
||||
x="134.56136"
|
||||
y="87.641937" /></text>
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13424"
|
||||
width="30.259069"
|
||||
height="10.161842"
|
||||
x="59.88644"
|
||||
y="89.964317" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13426"
|
||||
width="30.006399"
|
||||
height="9.965271"
|
||||
x="109.91815"
|
||||
y="89.971802" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13428"
|
||||
width="120.1084"
|
||||
height="29.916206"
|
||||
x="59.962482"
|
||||
y="110.0032" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13430"
|
||||
width="79.995499"
|
||||
height="19.930855"
|
||||
x="50.001808"
|
||||
y="150.04642" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13432"
|
||||
width="30.025837"
|
||||
height="20.014544"
|
||||
x="140.00171"
|
||||
y="149.99287" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13434"
|
||||
width="30.017694"
|
||||
height="19.955856"
|
||||
x="180.01677"
|
||||
y="150.02046" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13436"
|
||||
width="25.055296"
|
||||
height="5.0051007"
|
||||
x="65.036514"
|
||||
y="120.00324" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13438"
|
||||
width="15.015302"
|
||||
height="5.0051007"
|
||||
x="99.982841"
|
||||
y="120.00324" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13440"
|
||||
width="15.104679"
|
||||
height="5.0348926"
|
||||
x="125.00835"
|
||||
y="120.00324" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13442"
|
||||
width="25.055296"
|
||||
height="4.9455161"
|
||||
x="150.00406"
|
||||
y="120.00324" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13444"
|
||||
width="49.896049"
|
||||
height="4.9799647"
|
||||
x="65.061127"
|
||||
y="129.92778" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13446"
|
||||
width="54.986908"
|
||||
height="5.0085402"
|
||||
x="119.99342"
|
||||
y="129.92693" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13448"
|
||||
width="29.990734"
|
||||
height="5.0044012"
|
||||
x="55.004421"
|
||||
y="160.01282" />
|
||||
<rect
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1"
|
||||
id="rect13450"
|
||||
width="34.983311"
|
||||
height="5.0244079"
|
||||
x="90.007698"
|
||||
y="159.99748" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#TriangleStart)"
|
||||
d="m 90.236383,94.973843 18.766057,0.02043"
|
||||
id="path13506" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#marker13729)"
|
||||
d="m 120.03034,100.05297 v 8.94114"
|
||||
id="path13725" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#marker13777)"
|
||||
d="m 130.04023,109.96911 v -9.00387"
|
||||
id="path13773" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#marker13777)"
|
||||
d="m 85.03477,139.96281 v 9.03202"
|
||||
id="path13859" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#marker13777)"
|
||||
d="m 95.003439,149.99839 v -9.03202"
|
||||
id="path13903" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#marker13777)"
|
||||
d="m 130.02736,155.03475 h 8.98269"
|
||||
id="path13947" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#marker13777)"
|
||||
d="m 170.00592,154.92385 h 8.98269"
|
||||
id="path13991" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#marker13777)"
|
||||
d="m 140.00813,164.96008 h -8.92725"
|
||||
id="path14079" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.264999;stroke-opacity:1;marker-end:url(#marker13777)"
|
||||
d="m 180.04214,164.96008 h -9.03815"
|
||||
id="path14123" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 16 KiB |
Binary file not shown.
Binary file not shown.
|
@ -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}
|
|
@ -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}
|
Loading…
Reference in New Issue