Что за программа java 6

[an error occurred while processing this directive]

Конспект лекций по Java. Занятие 6

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive] (none)
[an error occurred while processing this directive] ([an error occurred while processing this directive] В.Фесюнов [an error occurred while processing this directive])

[an error occurred while processing this directive](none)

  • Практическая работа
  • Знакомство с библиотеками и пакетами.
  • Использование пакетов в программах
  • Создание своих собственных пакетов
  • Замечания по кодировке
  • Краткие пояснения к примеру

Практическая работа

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

Рынок Java в 2023, требования к кандидатам

Это класс DoubleVector (файл DoubleVector.java). Он предназначен для работы с векторами. В приведенном примере реализовано только скалярное умножение векторов, но при необходимости этот класс можно расширить другими операциями над векторами.

public class DoubleVector < private double[] vector = null; public DoubleVector(double[] vector) < this.vector = vector; >/** * Скалярное произведение векторов */ public double mult(DoubleVector anotherVector) < double s = 0; for ( int i = 0; i < vector.length; i++ ) < s += vector[i] * anotherVector.vector[i]; >return s; > public static double mult(DoubleVector a, DoubleVector b) < return a.mult(b); >public static void main(String[] args) < double[] a = ; double[] b = ; double[] c = ; DoubleVector v1 = new DoubleVector(a); DoubleVector v2 = new DoubleVector(b); DoubleVector v3 = new DoubleVector(c); System.out.println(«v1*v2=» + v1.mult(v2)); System.out.println(«v1*v2=» + DoubleVector.mult(v1, v2)); System.out.println(«v1*v3 v1*v2=» + v1.mult(v2)); и System.out.println(«v1*v3 v1*v2 a.mult(b)». Альтернативой является реализация алгоритма умножения в статическом методе и вызов его из обычного метода. Это выглядело бы так.

public double mult(DoubleVector anotherVector) < return mult(this, anotherVector); >public static double mult(DoubleVector a, DoubleVector b) < double s = 0; for ( int i = 0; i < a.vector.length; i++ ) < s += a.vector[i] * b.vector[i]; >return s; >

  • Данный класс не лишен недостатков. Он предполагает, что при умножении оба вектора имеют одинаковую длину. Для устранения подобных недостатков в Java следует применять аппарат исключительных ситуаций (exceptions), но мы его еще не рассматривали.

Знакомство с библиотеками и пакетами.

Библиотека Java — это сборник классов. Если программе нужен какой-то класс, то нужно подключить библиотеку, в которой этот класс находится. Для этого либо устанавливается переменная окружения CLASSPATH, либо задается параметр вызова компилятора и JVM. Для транслятора (javac.exe) — это параметр -classpath, для JVM (java.exe) — это параметр -cp.

Как работает Java — ликбез


rem трансляция d:jdk1.3binjavac.exe -classpath .;d:jdk1.3jrelibrt.jar My.java rem выполнение d:jdk1.3binjava.exe -cp .;d:jdk1.3jrelibrt.jar My

Обычно физически библиотека — это jar-файл (rt.jar, например). Но свою личную библиотеку можно сделать и просто в каком-либо каталоге. Кроме того, библиотека может быть zip-файлом.

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

Пока познакомимся с использованием пакетов из стандартной библиотеки Java. Лучше всего обратиться к документации по API Java. Полный список пакетов стандартной библиотеки Java:

java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font java.awt.geom java.awt.im java.awt.im.spi java.awt.image java.awt.image.renderable java.awt.print java.beans java.beans.beancontext java.io java.lang java.lang.ref java.lang.reflect java.math java.net java.rmi java.rmi.activation java.rmi.dgc java.rmi.registry java.rmi.server java.security java.security.acl java.security.cert java.security.interfaces java.security.spec java.sql java.text java.util java.util.jar java.util.zip javax.accessibility javax.naming javax.naming.directory javax.naming.event javax.naming.ldap javax.naming.spi javax.rmi javax.rmi.CORBA javax.sound.midi javax.sound.midi.spi javax.sound.sampled javax.sound.sampled.spi javax.swing javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo javax.transaction org.omg.CORBA org.omg.CORBA_2_3 org.omg.CORBA_2_3.portable org.omg.CORBA.DynAnyPackage org.omg.CORBA.ORBPackage org.omg.CORBA.portable org.omg.CORBA.TypeCodePackage org.omg.CosNaming org.omg.CosNaming.NamingContextPackage org.omg.SendingContext org.omg.stub.java.rmi

Нужно разобраться с именами пакетов. Как видно, имя составное, разделенное точками. Это связано с общепринятым в Java принципом построения имен пакетов. Этот принцип состоит в том, что в имени пакета присутствует Internet-адрес разработчика пакета в обратном порядке. На примере:

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

Некоторые важные пакеты Java

  • java.lang — «самый базовый» из всех базовых пакетов. Без него Java не работает.
  • java.io — пакет поддержки ввода/вывода.
  • java.util — классы поддержки коллекций объектов, работа с календарем, и др. полезные классы.
  • java.awt — пакет AWT: поддержка визуального программирования (базовый пакет).
  • javax.swing — пакет SWING: новый пакет визуального программирования. Появился в Java2, базируется на AWT и функционально замещает его (не полностью).
  • java.applet — пакет для поддержки создания аплетов.

Использование пакетов в программах

Для того чтобы класс из библиотеки мог быть использован в программе, его нужно подключить. Для этого в начале java-файла нужно поместить оператор «import». Например, пусть требуется использовать класс ArrayList в разрабатываемом нами классе Ex1 (ArrayList находится в пакете java.util).

Тогда файл Ex1.java может начинаться примерно так:

// Ex1.java import java.util.ArrayList; . . .

далее в программе мы уже можем использовать ArrayList. Например,

ArrayList objList = new ArrayList(); . . .

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

  • Пакет java.lang можно не подключать, он подключается автоматически.

Создание своих собственных пакетов

Для создания собственного пакета нужно

REM Компилятор JAVA set JDKHOME=d:jdk1.3 set CLASSPATH=.;%JDKHOME%jrelibrt.jar;c:javaproj d:jdk1.3binjavac %1 %2 %3 %4 %5
Файл для выполнения (jr.bat)
REM Запуск программы на JAVA set JDKH=d:jdk1.3 set CLASSPATH=.;%JDKH%jrelibrt.jar;%JDKHOME%jrelibi18n.jar;c:javaproj %JDKH%jrebinjava -cp %CLASSPATH% %1 %2 %3 %4 %5 %6
package ua.prov.my.util;

Реализуем простой пример.

Создадим в каталоге util такой файл S.java.

package ua.prov.my.util; public class S < public static void o(String str) < System.out.println(str); >>

Оттранслируем его командой

Теперь вернемся к примеру в начале занятия и модифицируем его.

import ua.prov.my.util.S;
System.out.println(«v1*v2=» + v1.mult(v2)); System.out.println(«v1*v2=» + DoubleVector.mult(v1, v2)); System.out.println(«v1*v3 code»> S.o(«v1*v2=» + v1.mult(v2)); S.o(«v1*v2=» + DoubleVector.mult(v1, v2)); S.o(«v1*v3 N10118»>

Практическая работа.

То, что мы изучили, достаточно для первого знакомства с визуальным программированием на Java. Некоторые элементы программ будут пока не ясны и мы будем использовать их as is . Но, в основном, приводимые далее программы могут быть поняты на основе изученного материала и могут быть использованы как прототипы для построения своих программ в стиле «сборка из известных компонент».

При создании визуальных приложений мы будем, в основном, использовать пакет javax.swing, а также java.awt и java.awt.event.

Читайте также:
Безопасный город программа что это

Рассмотрим первый пример диалоговой программы (файл Dialog1.java)

// Dialog1.java // Первый пример визульного приложения на Java. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Dialog1 < public static void main(String[] args) < // фрагмент as is (1) try < UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); >catch(Exception e) < >// JFrame frm = new JFrame(«Первое визуальное приложение»); frm.setSize(300, 200); Container c = frm.getContentPane(); c.add(new JLabel(«Hello, привет»)); // фрагмент as is (2) WindowListener wndCloser = new WindowAdapter() < public void windowClosing(WindowEvent e) < System.exit(0); >>; frm.addWindowListener(wndCloser); // frm.setVisible(true); > >

Замечания по кодировке

Для того, чтобы запустить данный пример, можно просто скопировать текст примера в буфер, а потом в некотором редакторе создать файл Dialog1.java и скопировать в него содержимое буфера. Единственная проблема — в кодировке русских символов. При формировании диалога используется кодировка Windows 1251.

Поэтому, если текст будет набран в другой кодировке, то он будет отображен в окне приложения неправильно. Каждый текстовый редактор имеет свои способы переключения кодировок. Скажем, при использовании встроенного редактора Far-Manager изменить кодировку с DOS (KOI8-R) на Win (Windows 1251) можно при помощи клавиши F8.

Краткие пояснения к примеру

  • UIManager — рассмотрим позднее;
  • JFrame — позволяет сформировать основное окно приложения. Все остальные визуальные компоненты помещаются внутрь этого окна.
  • Container — класс для визуальных классов-контейнеров, т.е. визуальных компонент, которые могут внутри себя содержать другие визуальные компоненты.
  • JLabel — класс для создания меток.
  • WindowListener и WindowAdapter — as is.

2. «фрагмент as is (1)» обеспечивает Windows Lookфрагмент as is (2)» обеспечивает завершение всего приложения в случае, если закрылось главное окно приложения. Тоже полезно закомментировать и посмотреть, что получиться.

4. Строки

JFrame frm = new JFrame(«Первое визуальное приложение»); frm.setSize(300, 200);

имеют очевидный смысл. (см.документацию по JFrame в пакете javax.swing).

5. Строки

Container c = frm.getContentPane(); c.add(new JLabel(«Hello, привет»));

требуют пояснения. Главное окно (JFrame) устроено сложным образом. Оно состоит из ряда элементов. Тот элемент, в который следует добавлять другие визуальные компоненты, может быть получен при помощи метода getContentPane().

Мы запоминаем ссылку на него в переменной ‘c’ и потом используем его во второй строке фрагмента, которая просто создает и добавляет (метод add) метку на окно.

  • При добавлении визуальных компонент в Java не указывается ни их позиция, ни размер. Это связано с тем, что все визуальные приложения Java масштабируемы и для обеспечения масштабируемости используются другие принципы размещения визуальных элементов, а именно, используются различные Layout’ы.

6. Строка frm.setVisible(true);

выводит окно на экран и активизирует диалог с пользователем.

Задание на дом

  • 1. Поместить класс DoubleVector в пакет algebra. Для этого убрать из него main-метод, создать отдельно класс TestVector, перенести в него этот main-метод, оттранслировать его и запустить на выполнение.
  • 2. Переделать TestVector в диалоговую программу. Т.е. вместо вывода на консоль операторами System.out.println(. ) нужно обеспечить вывод на экран. — Предлагается такой простейший вариант (не очень элегантный, но. ). У нас должно быть три операции вывода результата. Делаем на экране не одну, а три метки и заполняем их нужными значениями либо в конструкторе, либо методом setText(. ) класса JLabel. При простом добавлении трех меток возникнет небольшая проблема — они будут размещены одна поверх другой — и видна будет только одна из них. Чтобы избежать этого эффекта, достаточно добавить в конструктор строку

c.setLayout(new FlowLayout());

[an error occurred while processing this directive]
[an error occurred while processing this directive] (none)

  • Конспект лекций по Java
  • Оглавление
  • Занятие 1. Вступление.
  • Занятие 2. JAVA — объектно-ориентированный язык программирования.
  • Занятие 3. Реализация принципов объектно-ориентированного подхода в Java. Знакомство с документацией.
  • Занятие 4. Операции. Литералы. Операторы.
  • Занятие 5. Массивы. Конструкторы классов. Работа со строками.
  • Занятие 6. Знакомство с библиотеками и пакетами. Первая диалоговая программа.
  • Занятие 7. Наследование классов.
  • Занятие 8. Наследование классов (продолжение). Полиморфизм. Абстрактные классы. Интерфейсы.
  • Занятие 9. Вложенные классы.
  • Занятие 10. Статические вложенные классы. Коллекции объектов.
  • Занятие 11. Коллекции объектов (продолжение). Задание порядка на множестве.
  • Занятие 12. Коллекции — ассоциативные массивы (Map). Сортировка и поиск.
  • Занятия 13. Обработка исключительных ситуаций (Exceptions).
  • Занятие 14. Исключительные ситуации (продолжение). Ввод/вывод.
  • Занятие 15. Ввод/вывод (продолжение).
  • Занятие 16. Интерфейс FileFilter. Класс JFileChooser.
  • Занятие 17. Сериализация объектов.
  • Занятие 18. События и их реализация. Класс JList библиотеки Swing.
  • Занятие 19. Аплеты.
  • Занятие 20. Продолжение знакомства с библиотекой Swing. Класс JTabbedPane.
  • Занятие 21. Идентификация типа во время выполнения.
  • Занятие 22. Идентификация типа во время выполнения (продолжение). Множественные нити выполнения (Multiple threads).
  • Занятие 23. Множественные нити выполнения (продолжение).
  • Занятие 24. Множественные нити выполнения (продолжение).
  • Занятие 25. Технология JavaBeans.
  • Занятие 26. Технология JavaBeans (продолжение).

Источник: www.javable.com

Java 6.45 скачать бесплатно

Java 6.45

Мои программы

Java 6.45 – мощная утилита, помогающая запускать и редактировать программное обеспечение с использованием известного языка программирования. Она работает на огромном количестве платформ и имеет собственный бинарный формат. Софт позволяет просматривать трехмерные изображения, общаться с другими пользователями в сети, играть в онлайн-игры. Он совместим со всеми известными браузерами, предоставляет современные апплеты для установки и использования.

Джава изменился в лучшую сторону, появилась функция синхронизации с системами безопасности персонального компьютера и автоматической настройки актуальной версии.

Предлагаем Java 6.45 скачать бесплатно с официального сайта без регистрации, смс, вирусов и рекламы.

Отзывы пользователей

Новые программы

  • Tango
  • ACDSee Pro
  • PIXresizer
  • Symantec Antivirus
  • Nokia Software Updater
  • VLC Media Player
  • PlayFree browser
  • Vidalia Bundle
  • Far Manager
  • Adobe Photoshop
  1. Браузеры
  2. Антивирусы
  3. Графические редакторы
  4. Программы для общения
  5. Архиваторы
  6. Плееры
  7. Образы и запись дисков
  8. Загрузка файлов
  9. Файловые менеджеры
  10. Текстовые редакторы
  11. Аудио и видео обработка
  12. Системные программы
  1. WinSetupFromUSB для Windows 8.1
  2. iBooks 2
  3. PlayClaw 5
  4. Revo Uninstaller Pro 3.1.6
  5. Octave Portable
  6. Norton Internet Security 2012
  7. Statistica 6.0
  8. Joxi для Windows 8.1
  9. VMware Player 12
  10. PowerDVD 11
  11. UltraEdit 32
  12. PowerDVD 16
  13. Charles для Windows XP
  14. CINEBENCH 11.5
  15. Shazam 2016

Источник: moiprogrammy.com

Архитектура виртуальной машины Java: объяснение для начинающих

Независимо от того, приходилось ли вам разрабатывать на Java, вы, вероятно, слышали о виртуальной машине Java (JVM).

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

JVM изначально разрабатывалась исключительно для поддержки Java. Однако со временем на платформе Java обосновались многие другие языки, такие как Scala, Kotlin и Groovy. Все они в совокупности называются языками JVM.

В этой статье мы расскажем больше о JVM: как она работает и из каких компонентов состоит.

Что такое виртуальная машина?

Прежде чем переходить к JVM, остановимся на самой концепции виртуальной машины (ВМ).

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

На одной физической машине может работать несколько виртуальных, каждая со своей собственной операционной системой и приложениями. Эти виртуальные машины изолированы друг от друга.

Читайте также:
Cyberlink что это за программа можно ли удалить

Что такое виртуальная машина Java?

В языках программирования, таких как C и C++, код сначала компилируется в машинный для конкретной платформы. Эти языки называются компилируемыми языками.

С другой стороны, в таких языках, как JavaScript и Python, компьютер выполняет инструкции напрямую, без необходимости компиляции. Эти языки называются интерпретируемыми.

Java использует комбинацию обоих методов. Код Java сначала компилируется в байтовый код и генерирует файл класса ( .class ). Этот файл класса затем интерпретируется виртуальной машиной Java для базовой платформы. Один и тот же файл класса может выполняться на любой версии JVM, на любой платформе и операционной системе.

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

Архитектура виртуальной машины Java

JVM состоит из трех отдельных компонентов:

  • загрузчик классов;
  • область памяти/данных среды выполнения;
  • механизм выполнения.

Рассмотрим каждый из них более подробно.

Загрузчик классов

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

Как правило, первым в память загружается класс, содержащий метод main() .

Процесс загрузки класса состоит из трех этапов: загрузка, связывание и инициализация.

Загрузка

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

В Java доступны три встроенных загрузчика классов:

  • Загрузчик классов начальной загрузки(Bootstrap Class Loader) — корневой загрузчик классов. Это суперкласс загрузчика классов расширений, который загружает стандартные пакеты Java, такие как java.lang , java.net , java.util , java.io и так далее. Эти пакеты находятся внутри rt.jar и других основных библиотек, присутствующих в каталоге $JAVA_HOME/jre/lib .
  • Загрузчик классов расширений (Extension Class Loader) — подкласс загрузчика классов начальной загрузки и суперкласс загрузчика классов приложений. Он загружает расширения стандартных библиотек Java, которые присутствуют в каталоге $JAVA_HOME/jre/lib/ext .
  • Загрузчик классов приложений (Application Class Loader) — конечный загрузчик классов и подкласс загрузчика классов расширений. Он загружает файлы, которые находятся в пути к классам (classpath). По умолчанию путь к классу устанавливается как текущий каталог приложения. Путь к классу также можно изменить, добавив параметр командной строки -classpath или -cp .

JVM использует метод ClassLoader.loadClass() для загрузки класса в память. Он пытается загрузить класс на основе полного имени.

Если родительский загрузчик классов не может найти класс, он делегирует работу дочернему загрузчику классов. Если последний загрузчик также не может загрузить класс, он создает исключение NoClassDefFoundError или ClassNotFoundException .

Связывание

После загрузки класса в память происходит процесс связывания. Связывание класса или интерфейса предполагает объединение различных элементов и зависимостей программы.

Связывание включает следующие шаги.

  • Проверка. На этом этапе проверяется структурная корректность файла .class путем проверки его на соответствие набору ограничений и правил. Если проверка по какой-либо причине завершается неудачей, выбрасывается исключение VerifyException .

Например, если код был создан на Java 11, но выполняется в системе, где установлена Java 8, этап проверки завершится неудачно.

  • Подготовка. На этом этапе JVM выделяет память для статических полей класса или интерфейса и инициализирует их значениями по умолчанию.

Предположим, что вы объявили в классе следующую переменную:

private static final boolean enabled = true;

На этапе подготовки JVM выделяет память для переменной enabled и устанавливает ее значение в значение по умолчанию для логического значения, которое равно false .

  • Решение. На этом этапе символические ссылки заменяются прямыми, присутствующими в пуле констант времени выполнения.

Например, если у вас есть ссылки на другие классы или постоянные переменные, присутствующие в других классах, они разрешаются на этом этапе и заменяются их фактическими ссылками.

Инициализация

Инициализация включает выполнение метода инициализации класса или интерфейса (известного как ). Сюда может входить вызов конструктора класса, выполнение статического блока и присвоение значений всем статическим переменным. Это заключительный этап загрузки класса.

К примеру, ранее мы объявили следующее:

private static final boolean enabled = true;

На этапе подготовки переменной enabled было присвоено значение по умолчанию false . На этапе инициализации этой переменной присваивается ее фактическое значение true .

Примечание: JVM имеет многопоточный характер. Может случиться так, что несколько потоков одновременно пытаются инициализировать один и тот же класс. Это может привести к проблемам параллелизма. Чтобы гарантировать правильную работу программы в многопоточной среде, необходимо обеспечить потокобезопасность.

Область данных среды выполнения

В области данных среды выполнения есть пять компонентов:

Рассмотрим каждый из них в отдельности.

Область метода

Здесь хранятся все данные уровня класса, такие как пул констант времени выполнения, данные полей и методов, а также код методов и конструкторов.

Если памяти, доступной в области метода, недостаточно для запуска программы, JVM выдает ошибку OutOfMemoryError .

Например, предположим, что мы объявили следующий класс:

public class Employee
private String name;
private int age;

public Employee(String name, int age)
this.name = name;
this.age = age;
>
>

В этом примере данные уровня поля, такие как name и age , а также сведения о конструкторе загружаются в область метода.

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

Область кучи

Здесь хранятся все объекты и соответствующие им переменные экземпляра. Это область данных времени выполнения, из которой выделяется память для всех экземпляров классов и массивов.

Например, предположим, вы объявили следующий экземпляр:

Employee employee = new Employee();

В этом примере создается экземпляр класса Employee и загружается в область кучи.

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

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

Область стека

Всякий раз, когда в JVM создается новый поток, одновременно создается отдельный стек среды выполнения. Все локальные переменные, вызовы методов и частичные результаты хранятся в области стека.

Если для обработки в потоке требуется больший размер стека, чем доступно, JVM выдает ошибку StackOverflowError .

Для каждого вызова метода в памяти стека делается одна запись, которая называется фреймом стека. Когда вызов метода завершен, фрейм стека уничтожается.

Фрейм стека разделен на три части.

  • Локальные переменные. Каждый фрейм содержит массив переменных, известных как его локальные переменные. Здесь хранятся все локальные переменные и их значения. Длина этого массива определяется во время компиляции.
  • Стек операндов. Каждый фрейм содержит стек последним-вошел-первым-вышел (last-in-first-out, LIFO), известный как стек операндов. Он действует как рабочая область среды выполнения для любых промежуточных операций. Максимальная глубина этого стека определяется во время компиляции.
  • Данные фрейма. Здесь хранятся все символы, соответствующие методу. Здесь также хранится информация о блоке catch на случай исключений.

К примеру, есть следующий код:

double calculateNormalisedScore(List answers)
double score = getScore(answers);
return normalizeScore(score);
>

double normalizeScore(double score)
return (score – minScore) / (maxScore – minScore);
>

Читайте также:
Paragon для mac это что за программа

В этом примере кода переменные, такие как answers и score , помещаются в массив локальных переменных. Стек операндов содержит переменные и операторы, необходимые для выполнения математических операций вычитания и деления.

Примечание: поскольку область стека не является общей, она по своей сути потокобезопасна.

Регистры счетчика программ

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

Стеки нативных методов

JVM содержит стеки, которые поддерживают нативные методы, то есть такие методы, которые написаны на языке, отличном от Java, например C или C++. Для каждого нового потока также выделяется отдельный стек нативных методов.

Система выполнения

Как только байт-код загружен в основную память, и подробная информация становится доступна в области данных среды выполнения, наступает следующий этап — запуск программы. Механизм выполнения делает это, выполняя код из каждого класса.

Однако перед выполнением программы байт-код необходимо преобразовать в инструкции машинного языка. В качестве механизма выполнения JVM может задействовать интерпретатор или JIT-компилятор.

Интерпретатор

Интерпретатор считывает и выполняет инструкции байт-кода строка за строкой. Из-за построчного выполнения интерпретатор работает сравнительно медленнее.

Еще один недостаток интерпретатора — при многократном вызове метода каждый раз требуется новая интерпретация.

JIT-компилятор

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

Затем JIT-компилятор компилирует весь байт-код и изменяет его на собственный машинный код. Этот собственный машинный код используется непосредственно для повторных вызовов методов, что повышает производительность системы.

JIT-компилятор содержит следующие компоненты.

  • Генератор промежуточного кода — генерирует промежуточный код.
  • Оптимизатор кода — оптимизирует промежуточный код для повышения производительности.
  • Генератор целевого кода — преобразует промежуточный код в собственный машинный код.
  • Профилировщик — находит горячие точки (код, который выполняется повторно).

Чтобы лучше понять разницу между интерпретатором и JIT-компилятором, предположим, что у вас есть следующий код:

int sum = 10;
for(int i = 0 ; i sum += i;
>
System.out.println(sum);

Интерпретатор будет извлекать из памяти значение sum для каждой итерации в цикле, добавлять к нему значение i и записывать обратно в память. Это дорогостоящая операция, потому что каждый раз при входе в цикл происходит обращение к памяти.

Однако JIT-компилятор распознает, что в этом коде есть “горячая точка”, и выполнит оптимизацию. Он сохранит локальную копию sum в регистре для потока и будет продолжать добавлять значение i в цикле. Как только цикл завершится, компилятор запишет значение sum обратно в память.

Примечание: компилятору требуется больше времени для компиляции кода, чем интерпретатору для интерпретации кода строка за строкой. Если вы намерены запустить программу только один раз, интерпретатор будет предпочтительнее.

Сборщик мусора

Сборщик мусора (Garbage Collector, GC) собирает и удаляет объекты без ссылок из области кучи. Это процесс автоматического восстановления неиспользуемой памяти во время выполнения путем уничтожения мусорных объектов.

Сборка мусора делает память Java эффективной, потому что удаляет объекты без ссылок из памяти кучи и освобождает место для новых объектов. Она включает два этапа:

  • Пометка — на этом этапе GC идентифицирует неиспользуемые объекты в памяти.
  • Очистка — на этом этапе GC удаляет объекты, идентифицированные на предыдущем этапе.

Сборка мусора выполняется JVM автоматически через регулярные промежутки времени и не требует отдельной обработки. Ее также можно запустить вызовом System.gc() , но выполнение не гарантируется.

JVM содержит три различных типа сборщиков мусора.

  • Последовательная сборка мусора. Это самая простая реализация GC. Она предназначена для небольших приложений, работающих в однопоточных средах. Для сборки мусора используется один поток. Запуск приводит к событию “остановки мира”, когда все приложение приостанавливает работу. Аргумент JVM для запуск последовательного сборщика мусора: -XX:+UseSerialGC .
  • Параллельная сборка мусора. Это реализация GC по умолчанию, также известная как сборщик пропускной способности. Для сборки мусора в нем используется несколько потоков, но работа приложения все равно приостанавливается при запуске. Аргумент JVM для параллельного сборщика мусора: -XX:+UseParallelGC .
  • Garbage First (G1). G1 был разработан для многопоточных приложений с большим доступным размером кучи (более 4 ГБ). Он разбивает кучу на набор областей одинакового размера и использует несколько потоков для их сканирования. G1-сборщик определяет регионы с наибольшим количеством мусора и сначала выполняет сбор мусора в них. Аргумент JVM для этого сборщика мусора: -XX:+UseG1GC .

Примечание: существует другой тип сборщика мусора, называемый сборщиком параллельных меток (CMS). Однако он устарел начиная с Java 9 и полностью удален в Java 14, и его место занимает сборщик G1.

Нативный интерфейс Java (Java Native Interface, JNI)

Иногда необходимо задействовать в работе нативный (не Java) код (например, написанный на C/C++). К примеру, в тех случаях, когда нужно взаимодействовать с физическим оборудованием или преодолевать ограничения по управлению памятью и производительности в Java. Java поддерживает выполнение нативного кода через нативный интерфейс Java (JNI).

JNI действует как мост для предоставления вспомогательных пакетов другим языкам программирования, таким как C, C++ и так далее. Это особенно полезно в тех случаях, когда нужно написать код, который не полностью поддерживается Java, например, некоторые специфичные для платформы функции могут быть написаны только на C.

Вы можете воспользоваться ключевым словом native , чтобы указать, что реализация метода будет предоставлена нативной библиотекой. Также потребуется вызвать System.LoadLibrary() , чтобы загрузить общую нативную библиотеку в память и сделать ее функции доступными для Java.

Нативные библиотеки методов

Нативные библиотеки методов — это библиотеки, написанные на других языках программирования, таких как C, C++ и ассемблер. Эти библиотеки обычно представлены в виде файлов .dll или .so . Такие библиотеки можно загружать через JNI.

Распространенные ошибки JVM

  • ClassNotFoundException . Происходит, когда загрузчик классов пытается загрузить классы с помощью Class.forName() , ClassLoader.loadClass() или ClassLoader.findsystemclass() , но определение класса с указанным именем не найдено.
  • NoClassDefFoundError . Происходит, когда компилятор успешно скомпилировал класс, но загрузчик классов не может найти файл класса во время выполнения.
  • OutOfMemoryError . Происходит, когда JVM не может выделить объект из-за нехватки памяти, и сборщик мусора не может предоставить больше памяти.
  • StackOverflowError . Происходит, если в JVM не хватает места при создании новых кадров стека во время обработки потока.

Заключение

В этой статье мы обсудили архитектуру виртуальной машины Java и ее компоненты. Часто мы не вникаем глубоко во внутреннюю механику JVM или не интересуемся, как она работает, пока работает код.

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

Это также очень популярный вопрос во время интервью на роль бэкенд-разработчика — как младшего, так и старшего уровня. Глубокое понимание JVM поможет вам лучше писать код и избегать подводных камней, связанных со стеком и ошибками памяти.

  • 9 вещей, которыми следует заняться Java программисту в 2018 году
  • Превратите свой Java-код в полностью асинхронный
  • Циклы Java в сторону — даешь потоки!

Источник: medium.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru