Инструментарий java development kit кратко

Обновлено: 01.07.2024

Java Development Kit (JDK) является одним из трех основных технологических пакетов, используемых в программировании Java, наряду с JVM (Java Virtual Machine) и JRE (Java Runtime Environment). Важно различать эти три технологии, а также понимать, как они связаны.

  • JVM - это компонент платформы Java, который выполняет программы.
  • JRE - это дисковая часть Java, которая создает JVM.
  • JDK позволяет разработчикам создавать программы Java, которые могут быть выполнены и запущены JVM и JRE.

JRE может использоваться как автономный компонент для простого запуска программ Java, но он также является частью JDK. JDK требует JRE, потому что запуск программ Java является частью их разработки.

Так же, как мы сделали с моим недавним введением в виртуальной машине Java, давайте рассмотрим технические и бытовые определения в JDK

    Техническое определение: JDK является реализацией спецификации Платформы Java, включая компилятор и библиотеки классов.

В дополнение к JRE, которая является средой, используемой для запуска приложений Java, каждый JDK содержит компилятор Java. Компилятор - это программа, способная принимать java-файлы, которые являются простым текстом и рендерить их в исполняемый файл класса. Скоро мы увидим компилятор в действии. Во-первых, я покажу вам, как загрузить и настроить JDK в вашей среде разработки.

Начало работы с JDK

Получение установки Java в вашей среде разработки так же просто, как загрузка JDK и добавление его в свой classpath. При загрузке JDK необходимо выбрать версию Java, которую вы хотите использовать. Java 8 - это наиболее часто используемая версия, но по состоянию на эту написание Java 10-это новейшая версия. Java поддерживает обратную совместимость, поэтому мы просто загрузим последнюю версию.

В дополнение к выбору версии Java, вам также необходимо выбрать пакет Java. Пакеты представляют собой Java-разработки, которые предназначены для разных типов разработкт. Доступные пакеты: Java Enterprise Edition (Java EE), Java Standard Edition (Java SE) и Java Mobile Edition (Java ME).

Начинающие разработчики иногда не уверены, какой пакет подходит для их проекта. Как правило, каждая версия JDK содержит Java SE. Если вы загрузите Java EE или Java ME, вы получите стандартную версию с ним. Например, Jave EE - это стандартная платформа с дополнительными инструментами, полезными для разработки корпоративных приложений, такими как Enterprise JavaBeans или поддержка реляционного отображения объектов.

Также нетрудно переключиться на другой JDK в будущем, если вам это нужно. Не беспокойтесь слишком много о выборе правильной версии Java и пакета JDK, когда вы только начинаете.

Совместимость версий JDK

Поскольку JDK предоставляет компилятор для ваших программ Java, JDK, который вы используете, определяет, в какой версии Java вы можете программировать. Например, если вы хотите использовать более новую функциональную поддержку, найденную в Java 8, Как оператор arrow Lambda, то Вам нужно по крайней мере Java 8 JDK для компиляции. В противном случае, javac команда будет отклонять код с синтаксической ошибкой.

Загрузка JDK

Мы будем придерживаться Java SE для этого урока, чтобы мы могли сосредоточиться на основных классах и технологиях JDK. Чтобы скачать Java на SE JDK, то посетите страницу загрузок Oracle. Вы увидите различные доступные пакеты JDK:


Прежде чем выбрать загрузку Java SE, найдите минутку, чтобы посмотреть на другие варианты. Есть много вкусного на кухне Java!

Пойдите вперед и загрузите Java Standard Edition JDK.

Установка JDK

При запуске пакета JDK установщика вам будет предложено выбрать из трех компонентов: средство разработки, исходный код, и общественной среды JRE. Вы можете установить один или все из них. В этом случае просто выберите значение по умолчанию.

Установка опции "средства разработки" дает вам jdk собственно. Установка "Source Code" содержит источники для открытых классов в ядре java API. Включение этой опции позволяет ссылаться на исходный код при создании приложений. Третий вариант," Public JRE", приводит к тому, что JDK и JRE являются отдельными объектами: public JRE может использоваться другими программами для выполнения программ Java и может быть установлен отдельно от JDK.

Продолжайте установку всех трех компонентов и примите значения по умолчанию для каждого из них. Это означает, что JDK и JRE будут установлены в местах по умолчанию для вашей операционной системы. На Windows это C:\Program Files\Java.

JDK в командной строке

Установка JDK и JRE добавляет java команду в командную строку. Вы можете убедиться в этом, зайдя в командную строку и набрав java -version, который должен вернуть установленную версию Java. (В некоторых случаях вам придется перезагрузить систему для этого изменения пути).

Это хорошо: java установлено, но что javac? Вам понадобится этот элемент JDK для компиляции файлов Java.

javac команда живет внутри /jdk каталога, но не добавляется автоматически в систему во время установки. У нас есть возможность установить его javac сами, или мы можем установить IDE, который включает в себя эта команда. Начнем с компиляции и запуска Java-программы по старинке.

Простая программа Java

Шаг 1. Написать простую программу Java

Создайте новый текстовый файл, назовите Intro.java и поместите его где-то на компьютере.

Затем добавьте код из листинга 1, который является очень простой программой Java.

Шаг 2. Компиляция с JDK

Затем с помощью компилятора JDK превратите текстовый файл в исполняемую программу. Скомпилированный код в Java называется байт-код, и имеет .class расширение.

Вы будете использовать javac команду, которая вызывает для Java-компилятор. Введите полный путь к команде в командной строке, и передайте Intro.java файл как команду. В моей системе это выглядит так (предварительно перейти надо в каталог с java файлом)

Это должно привести к успешной компиляции. Если ничего не выведено - все в порядке. Любые ошибки будут отображены на консоли.

Шаг 3. Запустить файл .class

Теперь вы должны увидеть Intro.class файл в том же каталоге, что Intro.java. Вы можете запустить его, введя: java Intro. Обратите внимание, что расширение .class писать не надо.

Команда jar

javac это звезда в JDK, но /bin каталог содержит и другие инструменты, которые вам понадобятся. Пожалуй, наиболее известный после javac, это jar инструмент.

Один .jar-файл - это упакованный набор Java-классов. Как только компилятор создал .class файлы, разработчик может поставить их в один .jar, который сжимает и структурирует их предсказуемым образом.

Давайте преобразуем Intro.class в jar файл.

Перейдите обратно к каталогу, где вы разместили свой Intro.java и введите команду, которую вы видите ниже

Выполнение jar

Сейчас вы увидите intro.jar файл в каталоге. Можно использовать .jar , добавив его в ваш classpath и выполнения программы внутри, как показано здесь

Этот -cp переключатель говорит Java, чтобы добавить jar к classpath. jar-файл является излишним для этой крошечной программы, но он незаменим, поскольку программы растут в размере и полагаются на сторонние пакеты.

Возвращаясь на страницу загрузки JDK, вы можете заметить возможность загрузки JDK с IDE Netbeans. Среда IDE, или интегрированная среда разработки - это программа, которая предоставляет согласованный набор инструментов для разработки приложений. Подумайте о IDE как о визуальной операционной системе с набором инструментов, таких как файловый браузер и текстовый редактор, с дополнительными возможностями, характерными для разработки, такими как завершение кода и форматирование.

В разработке Java одна из ключевых вещей, которую делает IDE, - это управление компиляцией для вас. То есть IDE автоматически запускает процесс компиляции в фоновом режиме, поэтому вам не нужно постоянно делать это самостоятельно. IDE также обеспечивает воспроизведение по ходу игры, ловя ошибки кодирования на лету.

Несколько IDE существуют для Java. Вы видели, как JDK работает в командной строке, поэтому теперь давайте рассмотрим, как это работает в Eclipse IDE.

Eclipse и JDK

Установка Eclipse выходит за рамки этого руководства, но это простой процесс. Eclipse включает в себя инсталлятор, как и любую другую программу, и вы можете найти правильный установщик для своей операционной системы здесь.

Eclipse установлен, теперь откройте окно пункта меню в строке меню и выберите Настройки.


Внутри окна настроек, вы увидите пункт Java. Откройте его, и внутри вы увидите элемент Компилятор элемента. Там будут некоторые варианты для JDK.

Как упоминалось ранее, вам нужно будет выбрать правильную версию JDK для вашего проекта. Под капотом IDE будет работать компилятор JDK, так же, как вы запустили его из командной строки. IDE Eclipse также имеет свой собственный экземпляр JDK. IDE управляет JDK и JRE для вас, что делает жизнь намного проще!

Эта статья является второй в короткой серии, представляющей три основных компонента платформы Java: JVM, JDK и JRE. В следующей статью этой серии вы узнаете все о среде выполнения Java.

Java Development Kit (JDK) является одним из трех основных технологий, используемых в программировании на языке Java. К ним также относятся JVM (Java Virtual Machine) и JRE (Java Runtime Environment). Важно их различать, а также понимать, как они связаны:

  • JVM отвечает за исполнение Java-программ;
  • JRE создает и запускает JVM;
  • JDK позволяет разработчикам создавать программы, которые могут выполняться и запускаться посредством JVM и JRE;

Начинающие Java-разработчики часто путают JDK и JRE. Различие заключается в том, что JDK представляет собой пакет инструментов для разработки программного обеспечения, тогда как JRE представляет собой пакет инструментов для запуска Java-кода.

JRE может использоваться, как отдельный компонент для простого запуска Java-программ, либо быть частью JDK. JDK требуется JRE, потому что запуск программ является неотъемлемой частью их разработки.


  • Техническое определение: JDK — это реализация спецификации платформы Java, включающая в себя компилятор и библиотеки классов.
  • Обобщенное определение: JDK — это программный пакет, который вы загружаете для создания Java-приложений.

В дополнение к JRE, который является средой, используемой для запуска Java-приложений, каждый JDK содержит компилятор Java. Компилятор — это программа, способная принимать исходные файлы с расширением .java, которые являются обычным текстом, и превращать их в исполняемые файлы с расширением .class. Скоро мы рассмотрим как работает компилятор, но сперва разберемся, как загрузить и настроить JDK.

Установка и настройка JDK не представляет никакой сложности. При загрузке JDK необходимо выбрать какую версию Java вы хотите использовать. На данный момент Java 8 является все еще наиболее часто используемой версией (хотя уже и вышла Java 15). Java поддерживает обратную совместимость, поэтому просто загружайте последнюю версию.

В дополнение к версии Java, необходимо выбрать пакет (платформу). В Java доступны следующие платформы: Java Enterprise Edition (Java EE), Java Standard Edition (Java SE) и Java Mobile Edition (Java ME).

Начинающие разработчики иногда не могут разобраться, какой именно пакет подходит для их проекта. Как правило, каждая версия JDK содержит инструменты Java SE. Например, Java EE это стандартная платформа (SE) с дополнительными инструментами, полезными для разработки корпоративных приложений таких, как Enterprise JavaBeans или поддержка Object Relational Mapping.

Если вы являетесь начинающим разработчиком, то вас не должен беспокоить выбор правильной версии JDK пакета, так как при необходимости, можно без проблем переключиться на другой пакет.

Так как совместно с JDK поставляется компилятор, то, используемый вами JDK определяет, какую версию Java вы можете применить при разработке. Например, если вы хотите использовать новый функционал, появившийся в Java 15, то для корректной компиляции необходима, как минимум, Java 15 JDK. В противном случае команда javac сообщит о синтаксической ошибке в коде.

В этой статье мы остановимся на JDK SE и сосредоточимся на основных классах и технологиях Java SE. Чтобы загрузить JDK, посетите сайт любой компании, которая формирует бинарные сборки JDK, например Oracle, BellSoft и тд и скачайте нужную версию. Актуальный список таких компаний можно посмотреть по этой ссылке.

При запуске установщика JDK, вам для установки будет предложен выбор из трех компонентов: инструменты разработки, исходный код и JRE. Вы можете установить один или все из них.

Установка инструментов разработки дает вам доступ непосредственно к JDK. Исходный код содержит исходники публичных классов из Java Core API. Установка этого пункта позволит вам обращаться к исходному коду классов при разработке ваших приложений.

Устанавливайте все предлагаемые компоненты и принимайте значения по умолчанию. В вашу операционную систему будут установлены JDK, JRE и исходные коды классов. Путь установки используйте тот, который предлагается по умолчанию.

Установка JDK и JRE добавляет команду java в вашу командную строку. Вы можете проверить это, выполнив в командной строке команду java -version , которая должна вывести в консоль, установленную версию Java.

Утилита javac находится в директории /bin, но автоматически не добавляется в системную переменную PATH (представляет собой набор путей до каталогов, в которых расположены исполняемые файлы) во время установки (хотя, некоторые дистрибутивы такие, как Liberica делают это автоматически). Мы можем установить javac самостоятельно или установить IDE (интегрированная среда разработки), которая содержит эту команду.

Создайте новый текстовый файл под названием Intro.java в каком-нибудь редакторе и сохраните его куда-нибудь на своем компьютере.

Затем используйте JDK-компилятор, чтобы превратить ваш текстовый файл в исполняемую программу. Скомпилированный код в Java известен, как байт-код и имеет расширение class.

После компиляции должен появиться файл Intro.class в той же папке, что и Intro.java. Для его запуска используйте команду java :

Javac является важной частью JDK, но каталог /bin содержит и другие инструменты, которые вам понадобятся. Вероятно, наиболее важным после javac является инструмент jar.

Файл с расширением .jar является архивом для Java-классов. После того как компилятор создал class-файлы , разработчик может объединить их в .jar , который сжимает и структурирует их в необходимом порядке.

>Вернитесь в каталог, где вы разместили файл Intro.java и выполните следующую команду в командной строке:

Если все прошло хорошо, то в каталоге появился файл intro.jar . Вы можете его запустить, используя следующую команду:

Эта команда говорит Java, что искать метод main надо в классе Intro по пути intro.jar . Для такой маленькой программы не имеет смысла создавать .jar - файл. Но такие файлы необходимы, когда программа разрастается, а также использует сторонние библиотеки классов.

IDE (Integrated Development Environment) или интегрированная среда разработки — это программное обеспечение, которое представляет собой функциональный набор инструментов для разработки приложений. Воспринимайте IDE, как визуальную операционную систему с набором таких инструментов, как браузер файлов и текстовый редактор с дополнительными возможностями, специфичными для разработки (автодополнение кода, форматирование и т. д.).

Мы уже обсудили, как JDK работает в командной строке, теперь давайте немного посмотрим, как она работает в среде IntelliJ IDEA.

JavaDK-1.jpg

Java Development Kit - это бесплатно распространяемый комплект разработчика приложений на языке Java. Он включает в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE). Распространитель комплекта - это компания Oracle Corporation (ранее называлась Sun Microsystems). В состав JDK не входит интегрированная среда разработки на Java, поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.

Содержание

История

Компания 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.

Java SE JDK создается для каждой платформы: MS Windows, Solaris, Linux, отдельно, а документация написана на языке HTML и одинакова на всех платформах [Источник 1] .

Программы и классы, входящие в JDK

Набор программ и классов JDK содержит:

  • компилятор из исходного текста в байт-коды javac;
  • интерпретатор java, содержащий реализацию en:JVM;
  • облегченный интерпретатор jre (в последних версиях отсутствует);
  • программу просмотра апплетов appletviewer, заменяющую браузер;
  • отладчик jdb;
  • дизассемблер javap;
  • программу архивации и сжатия jar;
  • программу сбора и генерирования документации en:javadoc;
  • программу генерации заголовочных файлов языка C для создания "родных" методов javah;
  • программу генерации электронных ключей keytool;
  • программу native2ascii, преобразующую бинарные файлы в текстовые;
  • программы rmic иrmiregistry для работы с удаленными объектами;
  • программу serialver, определяющую номер версии класса;
  • библиотеки и заголовочные файлы "родных" методов;
  • библиотеку классов Java API (en:Application Programming Interface).

Версии

JDK имеет следующие версии:

  • JDK 1.0 (23.01.1996).
  • JDK 1.1 (19.02.1997).
  • J2SE 1.2 (08.12.1998).
  • J2SE 1.3 (08.05.2000).
  • J2SE 1.4 (06.02.2002).
  • J2SE 5.0 (30.09.2004).
  • Java SE 6 (11.12.2006).
  • Java SE 7 (07.07.2011).
  • Java SE 8 (18.03.2014).
  • Java SE 9 (21.09.2017).
  • Java SE 10 (20.03.2018).
  • Java SE 11 (25.09.2018).
  • Java SE 12 (19.03.2019).

Различие между JDK, SDK и ADK

en:SDK - это стандартный набор для разработки. Это не относится к Java, так как вы можете иметь SDK практически для любого языка. Это в значительной степени просто термин для пакета, в котором есть инструменты для создания материала с использованием его связанного языка.

JDK - это комплект разработки Java. Это то, что вы будете использовать для разработки Java-приложений. Он содержит файлы jar, библиотеки и инструменты, позволяющие вам писать и компилировать java-файлы, которые могут работать в JRE (среда выполнения java). Если в вашей системе установлен только JDK, то вам будет сложно разрабатывать для Android, так как пакеты с ключами отсутствуют. Вы должны будете установить их самостоятельно.

en:ADK - это комплект разработчика Android. По сути, это Java, но он настроен под код en:Android. Он также содержит поддержку эмуляторов и инструментов для разработки приложений для Android. Вы можете писать обычные Java-приложения OLE с помощью ADK, поскольку по своей сути это Java. Просто есть много других классов, которые работают специально для разработки Android. [Источник 2] .

Разница между JDK и JRE

"JDK" является Java Development Kit. То есть, это комплект JDK программного обеспечения, которое можно использовать для разработки Java Based программного обеспечения. "JRE" является Java Runtime Environment. То есть, en:JRE это реализация виртуальной машины Java, которая в действительности выполняет Java программы.

Как правило, каждый JDK содержит одно (или более) JRE's наряду с различными инструментами развития, такие как компиляторы Java источник, комплектации и средств развертывания, отладчиков, развитие библиотек и т.д [Источник 3] .

Ни для кого не секрет, что на данный момент 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 этапа:

  • Загрузка байт-кода и создание экземпляра класса Class
    Грубо говоря, чтобы попасть на 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’а, который мы указали при запуске приложения.

Процесс загрузки классов происходит по иерархии:

  • В первую очередь мы запрашиваем поиск в кэше System Class Loader (кэш системного загрузчика содержит классы, которые уже были им загружены);
  • Если класс не был найден в кэше системного загрузчика, мы смотрим кэш Extension class loader;
  • Если класс не найден в кэше загрузчика расширений, класс запрашивается у загрузчика Bootstrap.

4. Структура Сlass-файлов и процесс загрузки

Перейдем непосредственно к структуре Class-файлов.

Один класс, написанный на Java, компилируется в один файл с расширением .class. Если в нашем Java файле лежит несколько классов, один файл Java может быть скомпилирован в несколько файлов с расширением .class — файлов байт-кода данных классов.

Все числа, строки, указатели на классы, поля и методы хранятся в Сonstant pool — области памяти Meta space. Описание класса хранится там же и содержит имя, модификаторы, супер-класс, супер-интерфейсы, поля, методы и атрибуты. Атрибуты, в свою очередь, могут содержать любую дополнительную информацию.

Таким образом, при загрузке классов:

  • происходит чтение класс-файла, т.е проверка корректности формата
  • создается представление класса в Constant pool (Meta space)
  • грузятся супер-классы и супер-интерфейсы; если они не будут загружены, то и сам класс не будет загружен

5. Исполнение байт-кода на JVM

В первую очередь, для исполнения байт-кода, JVM может его интерпретировать. Интерпретация — довольно медленный процесс. В процессе интерпретации, интерпретатор “бежит” построчно по класс-файлу и переводит его в команды, которые понятны JVM.

Также JVM может его транслировать, т.е. скомпилировать в машинный код, который будет исполняться непосредственно на CPU.

Команды, которые исполняются часто, не будут интерпретироваться, а сразу будут транслироваться.

6. Компиляция

Компилятор — это программа, которая преобразует исходные части программ, написанные на языке программирования высокого уровня, в программу на машинном языке, “понятную” компьютеру.

Компиляторы делятся на:

  • Не оптимизирующие
  • Простые оптимизирующие (Hotspot Client): работают быстро, но порождают неоптимальный код
  • Сложные оптимизирующие (Hotspot Server): производят сложные оптимизирующие преобразования прежде чем сформировать байт-код

Также компиляторы могут классифицироваться по моменту компиляции:

  • Динамические компиляторы
    Работают одновременно с программой, что сказывается на производительности. Важно, чтобы эти компиляторы работали на коде, который часто исполняется. Во время исполнения программы JVM знает, какой код выполняется чаще всего, и, чтобы постоянно не интерпретировать его, виртуальная машина сразу переводит его в команды, которые уже будут исполняться непосредственно на процессорe.
  • Статические компиляторы
    Дольше компилируют, но порождают оптимальный код для исполнения. Из плюсов: не требуют ресурсов во время исполнения программы, каждый метод компилируется с применением оптимизаций.

7. Организация памяти в Java

Стек — это область памяти в Java, которая работает по схеме LIFO — “Last in — Fisrt Out” или “Последним вошел, первым вышел”.


Он нужен для того, чтобы хранить методы. Переменные в стеке существуют до тех пор, пока выполняется метод в котором они были созданы.

Когда вызывается любой метод в Java, создается фрейм или область памяти в стеке, и метод кладется на его вершину. Когда метод завершает выполнение, он удаляется из памяти, тем самым освобождая память для следующих методов. Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError. К примеру, это может произойти, если у нас будет рекурсивная функция, которая будет вызывать сама себя и памяти в стеке не будет хватать.

Ключевые особенности стека:

  • Стек заполняется и освобождается по мере вызова и завершения новых методов
  • Доступ к этой области памяти осуществляется быстрее, чем к куче
  • Размер стека определяется операционной системой
  • Является потокобезопасным, поскольку для каждого потока создается свой отдельный стек

Куча разбита на несколько более мелких частей, называемых поколениями:

  • Young generation — область, где размещаются недавно созданные объекты
  • Old (tenured) generation — область, где хранятся “долгоживущие” объекты
  • До Java 8 существовала ещё одна область — Permanent generation — которая содержит метаинформацию о классах, методах, статических переменных. После появления Java 8 было решено хранить эту информацию отдельно, вне кучи, а именно в Meta space


Почему отказались от Permanent generation? В первую очередь, это из-за ошибки, которая была связана с переполнением области: так как Perm имел константный размер и не мог расширяться динамически, рано или поздно память заканчивалась, кидалась ошибка, и приложение падало.

Meta space же имеет динамический размер, и во время исполнения он может расширяться до размеров памяти JVM.

Ключевые особенности кучи:

  • Когда эта область памяти заполняется полностью, Java бросает java.lang.OutOfMemoryError
  • Доступ к куче медленнее, чем к стеку
  • Для сбора неиспользуемых объектов работает сборщик мусора
  • Куча, в отличие от стека, не является потокобезопасной, так как любой поток может получить к ней доступ

Основываясь на информации выше, рассмотрим, как происходит управление памятью на простом примере:

У нас есть класс 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 дефрагментируется, т.е. последовательно заполняется нужными объектами.

Заключение


В данной статье мы разобрали базовые инструменты языка Java: JVM, JRE, JDK, принцип и этапы выполнения кода на JVM, компиляцию, организацию памяти, а также принцип работы сборщика мусора.

ОТМЕТЬТЕ - инструменты, описанные в этом разделе, неподдерживаются и экспериментальны в природе и должны использоваться с этим в памяти. Они не могли бы быть доступными в будущих версиях JDK.

    (jps, jstat, jstatd) (jinfo, jhat, jmap, jsadebugd, jstack) (jrunscript)

Поиск и устранение неисправностей Документации

  • Java™ SE Диагностирующий веб-сайт (инструменты, опции, и другие элементы для использования в анализе проблем)

ОТМЕТЬТЕ - у Некоторых инструментов есть отдельные ссылочные страницы для Windows, Linux и Соляриса, чтобы разместить незначительные различия в конфигурации и использовании - например, символ, используемый, чтобы определить, что разделители каталога могут отличаться.

Общая информация

Следующие документы содержат важную информацию, которую Вы должны будете знать, чтобы вытащить наиболее из инструментов JDK.

Тип документа Платформа
Файловая структура JDK [Солярис] [Linux] [Windows]
Установка Пути к классу [Солярис и Linux] [Windows]
Как Классы Находятся [Солярис, Linux и Windows]

Основные Инструменты

Средства обеспечения безопасности

Эти средства обеспечения безопасности помогают Вам получить, перечислить, и управлять билетами Kerberos.

Инструменты интернационализации

Удаленный Вызов метода (RMI) Инструменты

IDL Java и Инструменты IIOP RMI

Эти инструменты используются, создавая приложения, которые используют стандартный OMG IDL и CORBA/IIOP.
Имя инструмента Краткое Описание
tnameserv Обеспечивает доступ к службе именования.
idlj Генерирует.java файлы, которые отображаются, IDL OMG соединяют интерфейсом и позволяют приложению, записанному в языке программирования Java использовать функциональность CORBA.
orbd Оказывает поддержку для клиентов, чтобы прозрачно определить местоположение и вызвать персистентные объекты на серверы в среде CORBA. ORBD используется вместо Переходной Службы Именования, tnameserv. ORBD включает и Переходную Службу Именования и Персистентную Службу Именования. orbd инструмент включает функциональность Диспетчера серверов, Взаимодействующей Службы Именования, и Сервера Имени Начальной загрузки. Когда использующийся в соединении с servertool, Диспетчер серверов определяет местоположение, регистрирует, и активирует сервер, когда клиент хочет получить доступ к серверу.
servertool Предоставляет простой в употреблении интерфейс прикладным программистам, чтобы зарегистрировать, незарегистрировать, запустить, и завершить работу сервера.

Инструменты Развертывания Java

Утилиты для использования в соединении с развертыванием приложений java и апплетов в сети.
Имя инструмента Краткое Описание
pack200 Преобразовывает файл JAR в сжатое pack200 файл используя Java gzip компрессор. Сжатые упакованные файлы являются чрезвычайно сжатыми JAR, которые могут быть непосредственно развернуты, сохраняя пропускную способность и уменьшая время загрузки.
unpack200 Преобразовывает упакованный файл, произведенный pack200 в файл JAR.

Java веб-Инструменты Запуска

Утилиты для использования в соединении с Java веб-Запуск.
Имя инструмента Краткое Описание
javaws Инструмент командной строки для того, чтобы запуск Java веб-Запуск и установить различные варианты.
См. веб-Инструкцию Java для получения дополнительной информации.

Java Troublshooting, Профилирование, Контроль и Инструменты управления

Имя инструмента Краткое Описание
jconsole JMX-совместимый графический инструмент для того, чтобы контролировать виртуальную машину Java. Это может контролировать и локальные и удаленные JVM. Это может также контролировать и управлять приложением.
См. Контроль и управление для Платформы Java для получения дополнительной информации.

Инструменты Веб-сервисов Java

Имя инструмента Краткое Описание
schemagen Генератор схемы для Архитектуры Java для Привязки XML.
wsgen Инструмент, чтобы генерировать JAX-WS переносимые артефакты.
wsimport Инструмент, чтобы генерировать JAX-WS переносимые артефакты.
xjc Обязательный компилятор для Java Ardchitecture для Привязки XML.

Контроль Инструментов

Можно использовать следующие инструменты, чтобы контролировать статистику производительности JVM. Инструменты, описанные в этом разделе, неподдерживаются и экспериментальны, и должны использоваться с этим в памяти. Они, возможно, не доступны в будущих версиях JDK.

Эти инструменты поддерживаются на всех платформах кроме Windows 98 и Windows ME.

Имя инструмента Краткое Описание
jps Экспериментальный: Инструмент Состояния Процесса JVM - Списки инструментованные виртуальные машины Java HotSpot на целевой системе.
jstat Экспериментальный: Контрольный Инструмент Статистики JVM - Присоединения к инструментованной виртуальной машине Java HotSpot и собирают и регистрируют статистику производительности как определено параметрами командной строки.
jstatd Экспериментальный: JVM jstat Демон - Запуски серверное приложение RMI, которое контролирует для создания и завершения инструментованных виртуальных машин Java HotSpot и обеспечивает интерфейс, чтобы позволить инструментам дистанционного мониторинга присоединять к виртуальным машинам Java, работающим на локальной системе.

Поиск и устранение неисправностей Инструментов

Следующие инструменты могут использоваться для определенных задач поиска и устранения неисправностей. Инструменты, описанные в этом разделе, неподдерживаются и экспериментальны в природе и должны использоваться с этим в памяти. Они, возможно, не доступны в будущих версиях JDK.

Некоторые из этих инструментов не в настоящий момент доступны на платформах Windows .

Имя инструмента Краткое Описание
jinfo Экспериментальный - Информация Конфигурации для Java - конфигурационная информация Печатных изданий для данного процесса или базового файла или удаленного сервера отладки.
jhat Экспериментальный - Браузер Дампа "Кучи" - Запускает веб-сервер на файле дампа "кучи" (eg, произведенный jmap - дамп), позволяя "кучу" быть просмотренным.
jmap Экспериментальный - Карта Памяти для Java - Печатные издания совместно использованные объектные карты памяти или детали памяти "кучи" данного процесса или базового файла или удаленного сервера отладки.
jsadebugd Экспериментальный - Демон Отладки Агента Удобства обслуживания для Java - Присоединения к процессу или базовому файлу и действиям как сервер отладки.
jstack Экспериментальный - Трассировка Стека для Java - Печатные издания трассировка стека потоков для данного процесса или базового файла или удаленного сервера отладки.

Пошлите к Java™ SE Диагностирующий веб-сайт для описаний инструментов, опций, и другой информации использовать в анализе проблем. Документы на этом сайте содержат предложения о том, что попробовать прежде, чем представить отчет об ошибках и что данные собраться для отчета.

Читайте также: