Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Java Development Kit
Содержание
История
Компания Sun Microsystems активно развивала и обновляла JDK, почти каждый год выходили новые версии. В 1996 г. была выпущена первая версия — JDK 1.0, которая модифицировалась до версии с номером 1.0.2. В этой версии библиотека классов Java API содержала 8 пакетов. Весь набор JDK 1.0.2 поставлялся в упакованном виде в одном файле размером около 5 Мбайт, а после распаковки занимал на диске около 8 Мбайт.
В 1997 г. появилась версия JDK 1.1, последняя ее модификация, 1.1.8, выпущена в 1998 г. В этой версии было 23 пакета классов, занимала она 8,5 Мбайт в упакованном виде и около 30 Мбайт — в распакованном. В первых версиях JDK все пакеты библиотеки Java API были упакованы в один архивный файл classes.zip и вызывались непосредственно из этого архива, его не нужно было распаковывать. Затем набор инструментальных средств JDK был сильно переработан.
Версия JDK 1.2 вышла в декабре 1998 г. и содержала уже 57 пакетов классов. В архивном виде это файл размером почти 20 Мбайт и еще отдельный файл размером более 17 Мбайт с упакованной документацией. Полная версия располагается на 130 Мбайт дискового пространства, из них около 80 Мбайт занимает документация. Начиная с этой версии, все продукты технологии Java собственного производства компания Sun стала называть Java 2 Platform, Standard Edition, сокращенно J2SE, а в литературе утвердилось название Java 2. Кроме 57 пакетов классов, обязательных на любой платформе и получивших название Core API, в Java 2 JDK 1.2 входят еще дополнительные пакеты классов, называемые en:Standard Extension API.
В версии J2SE JDK 1.5.0, вышедшей в конце 2004 г., было уже под сотню пакетов, составляющих Core API (Application Programming Interface). В упакованном виде — это файл размером около 46 Мбайт и необязательный файл с упакованной документацией такого же размера. В это же время произошло очередное переименование технологии. Из версии убрали первую цифру и стали писать Java 2 Platform, Standard Edition 5.0, сокращенно J2SE 5.0 и JDK 5.0, хотя во внутрифирменной документации сохраняется название JDK 1.5.0. Последнее обновление J2SE 5.0, JDK 1.5.0_22, было выпущено 3 ноября 2009 года.
В шестой версии, вышедшей в начале 2007 г., из названия технологии убрали цифру 2 и стали писать Java Platform, Standard Edition 6, сокращенно — Java SE 6 и JDK 6. Впрочем, во внутрифирменной документации остается прежнее обозначение, например последнее на момент написания книги обновление обозначается JDK 1.6.0_26. Летом 2011 года появилась седьмая версия Java SE 7 и распространяется JDK 1.7.0.
Программы и классы, входящие в JDK
Набор программ и классов JDK содержит:
Версии
JDK имеет следующие версии:
Различие между JDK, SDK и ADK
Разница между JDK и JRE
«JDK» является Java Development Kit. То есть, это комплект JDK программного обеспечения, которое можно использовать для разработки Java Based программного обеспечения. «JRE» является Java Runtime Environment. То есть, en:JRE это реализация виртуальной машины Java, которая в действительности выполняет Java программы.
Java development kit что такое
Java Development Kit (JDK) является одним из трех основных технологических пакетов, используемых в программировании Java, наряду с JVM (Java Virtual Machine) и JRE (Java Runtime Environment). Важно различать эти три технологии, а также понимать, как они связаны.
JRE может использоваться как автономный компонент для простого запуска программ Java, но он также является частью JDK. JDK требует JRE, потому что запуск программ Java является частью их разработки.
Так же, как мы сделали с моим недавним введением в виртуальной машине Java, давайте рассмотрим технические и бытовые определения в JDK
Начало работы с JDK
В дополнение к выбору версии Java, вам также необходимо выбрать пакет Java. Пакеты представляют собой Java-разработки, которые предназначены для разных типов разработкт. Доступные пакеты: Java Enterprise Edition (Java EE), Java Standard Edition (Java SE) и Java Mobile Edition (Java ME).
Также нетрудно переключиться на другой JDK в будущем, если вам это нужно. Не беспокойтесь слишком много о выборе правильной версии Java и пакета JDK, когда вы только начинаете.
Совместимость версий JDK
Поскольку JDK предоставляет компилятор для ваших программ Java, JDK, который вы используете, определяет, в какой версии Java вы можете программировать. Например, если вы хотите использовать более новую функциональную поддержку, найденную в Java 8, Как оператор arrow Lambda, то Вам нужно по крайней мере Java 8 JDK для компиляции. В противном случае, javac команда будет отклонять код с синтаксической ошибкой.
Мы будем придерживаться Java SE для этого урока, чтобы мы могли сосредоточиться на основных классах и технологиях JDK. Чтобы скачать Java на SE JDK, то посетите страницу загрузок Oracle. Вы увидите различные доступные пакеты JDK:
Прежде чем выбрать загрузку Java SE, найдите минутку, чтобы посмотреть на другие варианты. Есть много вкусного на кухне Java!
Вы бы загрузили Java EE JDK, если бы вы были в первую очередь заинтересованы в создании веб-приложений на основе Java. Java EE JDK включает спецификацию Сервлета Java, которая поддерживает обработку HTTP-запросов. Каждый Java ее реализации JDK также требует контейнера, который представляет собой сервер, который запускает приложения. Glassfish является эталонной реализацией сервера Java EE для Oracle. Другие популярные реализации-Tomcat и Jetty.
Пойдите вперед и загрузите Java Standard Edition JDK.
При запуске пакета JDK установщика вам будет предложено выбрать из трех компонентов: средство разработки, исходный код, и общественной среды JRE. Вы можете установить один или все из них. В этом случае просто выберите значение по умолчанию.
Установка опции «средства разработки» дает вам jdk собственно. Установка «Source Code» содержит источники для открытых классов в ядре java API. Включение этой опции позволяет ссылаться на исходный код при создании приложений. Третий вариант,» Public JRE», приводит к тому, что JDK и JRE являются отдельными объектами: public JRE может использоваться другими программами для выполнения программ Java и может быть установлен отдельно от JDK.
Продолжайте установку всех трех компонентов и примите значения по умолчанию для каждого из них. Это означает, что JDK и JRE будут установлены в местах по умолчанию для вашей операционной системы. На Windows это C:\Program Files\Java.
JDK в командной строке
Это хорошо: java установлено, но что javac? Вам понадобится этот элемент JDK для компиляции файлов Java.
javac команда живет внутри /jdk каталога, но не добавляется автоматически в систему во время установки. У нас есть возможность установить его javac сами, или мы можем установить IDE, который включает в себя эта команда. Начнем с компиляции и запуска Java-программы по старинке.
Простая программа Java
Шаг 1. Написать простую программу Java
Создайте новый текстовый файл, назовите Intro.java и поместите его где-то на компьютере.
Затем добавьте код из листинга 1, который является очень простой программой Java.
Шаг 2. Компиляция с JDK
Вы будете использовать javac команду, которая вызывает для Java-компилятор. Введите полный путь к команде в командной строке, и передайте Intro.java файл как команду. В моей системе это выглядит так (предварительно перейти надо в каталог с java файлом)
javac это звезда в JDK, но /bin каталог содержит и другие инструменты, которые вам понадобятся. Пожалуй, наиболее известный после javac, это jar инструмент.
Давайте преобразуем Intro.class в jar файл.
Перейдите обратно к каталогу, где вы разместили свой Intro.java и введите команду, которую вы видите ниже
Несколько IDE существуют для Java. Вы видели, как JDK работает в командной строке, поэтому теперь давайте рассмотрим, как это работает в Eclipse IDE.
Установка Eclipse выходит за рамки этого руководства, но это простой процесс. Eclipse включает в себя инсталлятор, как и любую другую программу, и вы можете найти правильный установщик для своей операционной системы здесь.
Eclipse установлен, теперь откройте окно пункта меню в строке меню и выберите Настройки.
Внутри окна настроек, вы увидите пункт Java. Откройте его, и внутри вы увидите элемент Компилятор элемента. Там будут некоторые варианты для JDK.
Как упоминалось ранее, вам нужно будет выбрать правильную версию JDK для вашего проекта. Под капотом IDE будет работать компилятор JDK, так же, как вы запустили его из командной строки. IDE Eclipse также имеет свой собственный экземпляр JDK. IDE управляет JDK и JRE для вас, что делает жизнь намного проще!
Эта статья является второй в короткой серии, представляющей три основных компонента платформы Java: JVM, JDK и JRE. В следующей статью этой серии вы узнаете все о среде выполнения Java.

68) JDK против JRE против JVM
Что такое JDK?
JDK — это среда разработки программного обеспечения, используемая для создания апплетов и приложений Java. Полная форма JDK — Java Development Kit. Разработчики Java могут использовать его в Windows, macOS, Solaris и Linux. JDK помогает им кодировать и запускать программы на Java. На одном компьютере можно установить более одной версии JDK.
В этом уроке вы узнаете:
Что такое JRE?
JRE — это часть программного обеспечения, предназначенная для запуска другого программного обеспечения. Он содержит библиотеки классов, класс загрузчика и JVM. Проще говоря, если вы хотите запустить Java-программу, вам нужна JRE. Если вы не программист, вам не нужно устанавливать JDK, а просто JRE для запуска программ на Java. Тем не менее, все версии JDK поставляются в комплекте с Java Runtime Environment, поэтому вам не нужно загружать и устанавливать JRE отдельно на вашем ПК. Полная форма JRE — Java Runtime Environment.
Что такое JVM?
JVM — это механизм, обеспечивающий среду выполнения для управления Java-кодом или приложениями. Он преобразует байт-код Java в машинный язык. JVM является частью Java Run Environment (JRE). Его нельзя отдельно загрузить и установить. Чтобы установить JVM, вам нужно установить JRE. Полная форма JVM — виртуальная машина Java.
Во многих других языках программирования компилятор создает машинный код для конкретной системы. Однако компилятор Java создает код для виртуальной машины, которая называется JVM.
Зачем использовать JDK?
Вот важные причины использования JDK:
Зачем использовать JRE?
Вот важные причины использования JRE:
Why JVM?
Here are the important reasons of using JVM:
Features of JDK
Here are the important features of JDK:
Features of JRE
Here are the important features of JRE:
Features of JVM
Here are the important features of JVM:
How JDK Functions?
Here are the important components of JDK:
Как функционирует JRE?

JRE имеет экземпляр JVM с ним, библиотечные классы и инструменты разработки. Как только вы пишете и компилируете код Java, компилятор генерирует файл класса с байтовым кодом.
Вот важные компоненты JRE:
Таким образом, Java-программа работает в JRE.
Как функционирует JVM?

Вот важные компоненты JVM:
1) Класс Loader
Загрузчик классов — это подсистема, используемая для загрузки файлов классов. Он выполняет три основные функции, а именно. Загрузка, связывание и инициализация.
2) Область метода
Область методов JVM хранит структуру класса, такую как метаданные, код для методов Java и постоянный пул времени выполнения.
3) куча
Все объекты, массивы и переменные экземпляра хранятся в куче. Эта память распределяется между несколькими потоками.
4) Языковые стеки JVM
Стеки языка Java хранят локальные переменные и их частичные результаты. Каждый поток имеет свой собственный языковой стек JVM, создаваемый одновременно с созданием потока. Новый кадр создается при вызове метода и удаляется по завершении процесса вызова метода.
5) ПК Регистры
Регистры ПК хранят адрес инструкции виртуальной машины Java, которая в данный момент выполняется. В Java каждый поток имеет свой отдельный регистр ПК.
6) Стеки родного метода
Стеки нативных методов содержат инструкцию нативного кода, зависит от нативной библиотеки. Он распределяет память по собственным кучам или использует любой тип стека.
7) Исполнение двигателя
Это тип программного обеспечения, который используется для тестирования программного обеспечения, оборудования или комплектных систем. Механизм выполнения теста никогда не несет никакой информации о тестируемом продукте.
8) интерфейс родного метода
Интерфейс Native Method представляет собой среду программирования. Он позволяет коду Java, который выполняется в JVM, вызываться библиотеками и собственными приложениями.
9) Библиотеки нативных методов
Собственные библиотеки — это коллекция Собственных библиотек (C, C ++), которые необходимы для механизма исполнения.
Разница между JDK, JRE и JVM
Вот основные различия между JDK против JRE и JVM:
Инструменты для запуска и разработки Java приложений, компиляция, выполнение на JVM
Ни для кого не секрет, что на данный момент Java — один из самых популярных языков программирования в мире. Дата официального выпуска Java — 23 мая 1995 года.
Эта статья посвящена основам основ: в ней изложены базовые особенности языка, которые придутся кстати начинающим “джавистам”, а опытные Java-разработчики смогут освежить свои знания.
* Статья подготовлена на основе доклада Евгения Фраймана — Java разработчика компании IntexSoft.
В статье присутствуют ссылки на внешние материалы.
1. JDK, JRE, JVM
Java Development Kit — комплект разработчика приложений на языке Java. Он включает в себя Java Development Tools и среду выполнения Java — JRE (Java Runtime Environment).
Java development tools включают в себя около 40 различных тулов: javac (компилятор), java (лаунчер для приложений), javap (java class file disassembler), jdb (java debugger) и др.
Среда выполнения JRE — это пакет всего необходимого для запуска скомпилированной Java-программы. Включает в себя виртуальную машину JVM и библиотеку классов Java — Java Class Library.
JVM — это программа, предназначенная для выполнения байт-кода. Первое преимущество JVM — это принцип “Write once, run anywhere”. Он означает, что приложение, написанное на Java, будет работать одинаково на всех платформах. Это является большим преимуществом JVM и самой Java.
До появления Java, многие компьютерные программы были написаны под определенные компьютерные системы, а предпочтение отдавалось ручному управлению памятью, как более эффективному и предсказуемому. Со второй половины 1990-х годов, после появления Java, автоматическое управление памятью стало общей практикой.
Существует множество реализаций JVM, как коммерческих, так и с открытым кодом. Одна из целей создания новых JVM — увеличение производительности для конкретной платформы. Каждая JVM пишется под платформу отдельно, при этом есть возможность написать ее так, чтобы она работала быстрее на конкретной платформе. Самая распространённая реализация JVM — это JVM Hotspot от OpenJDK. Также есть реализации IBM J9, Excelsior JET.
2. Выполнение кода на JVM
Согласно спецификации Java SE, для того, чтобы получить код, работающий в JVM, необходимо выполнить 3 этапа:
3. Загрузчики классов и их иерархия
Вернемся к загрузчикам классов — это специальные классы, которые являются частью JVM. Они загружают классы в память и делают их доступными для выполнения. Загрузчики работают со всеми классами: и с нашими, и с теми, которые непосредственно нужны для Java.
Представьте ситуацию: мы написали свое приложение, и помимо стандартных классов там есть наши классы, и их очень много. Как с этим будет работать JVM? В Java реализована отложенная загрузка классов, иными словами lazy loading. Это значит, что загрузка классов не будет выполняться до тех пор, пока в приложении не встретится обращение к классу.
Иерархия загрузчиков классов
Первый загрузчик классов — это Bootstrap classloader. Он написан на C++. Это базовый загрузчик, который загружает все системные классы из архива rt.jar. При этом, есть небольшое отличие между загрузкой классов из rt.jar и наших классов: когда JVM загружает классы из rt.jar, она не выполняет все этапы проверки, которые выполняются при загрузке любого другого класс-файла т.к. JVM изначально известно, что все эти классы уже проверены. Поэтому, включать в этот архив какие-либо свои файлы не стоит.
Следующий загрузчик — это Extension classloader. Он загружает классы расширений из папки jre/lib/ext. Допустим, вы хотите, чтобы какой-то класс загружался каждый раз при старте Java машины. Для этого вы можете скопировать исходный файл класса в эту папку, и он будет автоматически загружаться.
Еще один загрузчик — System classloader. Он загружает классы из classpath’а, который мы указали при запуске приложения.
Процесс загрузки классов происходит по иерархии:
4. Структура Сlass-файлов и процесс загрузки
Перейдем непосредственно к структуре Class-файлов.
Все числа, строки, указатели на классы, поля и методы хранятся в Сonstant pool — области памяти Meta space. Описание класса хранится там же и содержит имя, модификаторы, супер-класс, супер-интерфейсы, поля, методы и атрибуты. Атрибуты, в свою очередь, могут содержать любую дополнительную информацию.
Таким образом, при загрузке классов:
5. Исполнение байт-кода на JVM
В первую очередь, для исполнения байт-кода, JVM может его интерпретировать. Интерпретация — довольно медленный процесс. В процессе интерпретации, интерпретатор “бежит” построчно по класс-файлу и переводит его в команды, которые понятны JVM.
Также JVM может его транслировать, т.е. скомпилировать в машинный код, который будет исполняться непосредственно на CPU.
Команды, которые исполняются часто, не будут интерпретироваться, а сразу будут транслироваться.
6. Компиляция
Компилятор — это программа, которая преобразует исходные части программ, написанные на языке программирования высокого уровня, в программу на машинном языке, “понятную” компьютеру.
Компиляторы делятся на:
Также компиляторы могут классифицироваться по моменту компиляции:
7. Организация памяти в Java
Стек — это область памяти в Java, которая работает по схеме LIFO — “Last in — Fisrt Out” или “Последним вошел, первым вышел”.
Он нужен для того, чтобы хранить методы. Переменные в стеке существуют до тех пор, пока выполняется метод в котором они были созданы.
Когда вызывается любой метод в Java, создается фрейм или область памяти в стеке, и метод кладется на его вершину. Когда метод завершает выполнение, он удаляется из памяти, тем самым освобождая память для следующих методов. Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError. К примеру, это может произойти, если у нас будет рекурсивная функция, которая будет вызывать сама себя и памяти в стеке не будет хватать.
Ключевые особенности стека:
Куча разбита на несколько более мелких частей, называемых поколениями:
Почему отказались от Permanent generation? В первую очередь, это из-за ошибки, которая была связана с переполнением области: так как Perm имел константный размер и не мог расширяться динамически, рано или поздно память заканчивалась, кидалась ошибка, и приложение падало.
Meta space же имеет динамический размер, и во время исполнения он может расширяться до размеров памяти JVM.
Ключевые особенности кучи:
Основываясь на информации выше, рассмотрим, как происходит управление памятью на простом примере:
У нас есть класс App, в котором единственный метод main состоит из:
— примитивной переменой id типа int со значением 23
— ссылочной переменной pName типа String со значением Jon
— ссылочной переменной p типа person
Как уже упоминалось, при вызове метода на вершине стека создаётся область памяти, в которой хранятся данные, необходимые этому методу для выполнения.
В нашем случае, это ссылка на класс person: сам объект хранится в куче, а в стеке хранится ссылка. Также в стек кладется ссылка на строку, а сама строка хранится в куче в String pool. Примитив хранится непосредственно в стеке.
Для вызова конструктора с параметрами Person (String) из метода main() в стеке, поверх предыдущего вызова main() создается в стеке отдельный фрейм, который хранит:
— this — ссылка на текущий объект
— примитивное значение id
— ссылочную переменную personName, которая указывает на строку в String Pool.
После того, как мы вызвали конструктор, вызывается setPersonName(), после чего снова создается новый фрейм в стеке, где хранятся те же данные: ссылка на объект, ссылка на строку, значение переменной.
Таким образом, когда выполнится метод setter, фрейм пропадет, стек очистится. Далее выполняется конструктор, очищается фрейм, который был создан под конструктор, после чего метод main() завершает свою работу и тоже удаляется из стека.
Если будут вызваны другие методы, для них будут также созданы новые фреймы с контекстом этих конкретных методов.
8. Garbage collector
В куче работает Garbage collector — программа, работающая на виртуальной машине Java, которая избавляется от объектов, к которым невозможно получить доступ.
Разные JVM могут иметь различные алгоритмы сборки мусора, также существуют разные сборщики мусора.
Мы поговорим о самом простом сборщике Serial GC. Сборку мусора мы запрашиваем при помощи System.gc().
Как уже было упомянуто выше, куча разбита на 2 области: New generation и Old generation.
New generation (младшее поколение) включает в себя 3 региона: Eden, Survivor 0 и Survivor 1.
Old generation включает в себя регион Tenured.
Что происходит, когда мы создаем в Java объект?
В первую очередь объект попадает в Eden. Если мы создали уже много объектов и в Eden уже нет места, срабатывает сборщик мусора и освобождает память. Это, так называемая, малая сборка мусора — на первом проходе он очищает область Eden и кладёт “выжившие” объекты в регион Survivor 0. Таким образом регион Eden полностью высвобождается.
Если произошло так, что область Eden снова была заполнена, garbage collector начинает работу с областью Eden и областью Survivor 0, которая занята на данный момент. После очищения выжившие объекты попадут в другой регион — Survivor 1, а два остальных останутся чистыми. При последующей сборке мусора в качестве региона назначения опять будет выбран Survivor 0. Именно поэтому важно, чтобы один из регионов Survivor всегда был пустым.
JVM следит за объектами, которые постоянно копируются и перемещаются из одного региона в другой. И для того, чтобы оптимизировать данный механизм, после определённого порога сборщик мусора перемещает такие объекты в регион Tenured.
Когда в Tenured места для новых объектов не хватает, происходит полная сборка мусора — Mark-Sweep-Compact.
Во время этого механизма определяется, какие объекты больше не используются, регион очищается от этих объектов, и область памяти Tenured дефрагментируется, т.е. последовательно заполняется нужными объектами.






