Java Flashcards
Идея языка
Кроссплатформенность - написано/скомпилировано однажды, запускается везде.
Приложения java транслируются в специальный байт код, поэтому они могут работать на любой компьютерной архитектуре, для которой существует реализация виртуальной java машины.
JVM
Java Virtual Machine - виртуальная машина java - основная часть исполняющей системы java : JRE (Java runtime environment).
JVM исполняет байт-код, созданный из текста java-программы компилятором java( javac). Может так же использоваться доя выполнения программ на других языках, скомпилированных в байт-код java.
Source code Java —> Java compiler—> Bytecode Java —> JVM —> computer
Преимущества Java
- объектно-ориентированный - все является обьектом
- платформонезависимый
- простой для понимания (основные концепции ооп)
- безопасный - методы проверки подлинности основаны на шифровании с открытым ключом
- архитектурно-нейтральным - скомпилированный код исполняется на многих процессорах
- автоматическое управление памятью
- многопоточность
- большое сообщество
Недостатки Java
- платное коммерческое использование
- низкая производительность (компиляция, абстракция, очистка памяти, взаимная блокировка потоков)
JDK
Комплект разработчика на языке java:
- компилятор Java (javac)
- стандартные библиотеки, документация, утилиты
- исполнительная система Java (JRE : JVM + библиотеки классов)
JRE
Java Runtime Enviroment - среда выполнения для java - минимальная реализация виртуальной машины, необходимая для исполнения java приложений, без компилятора
byte code
Машинно-независимый код низкого уровня, генерируемый транслятором из исходного кода
Classloader
Часть JRE, которая динамически загружает Java классы в JVM. Обычно классы загружаются только по запросу. Система исполнения в Java не должна знать о файлах.
Загрузчик ищет библиотеки, читает их содержимое, загружает классы из библиотек по требованию.
Загрузчики классов:
- Bootstrap classloader(загрузчик класса bootstrap) : загружает основные библиотеки Java, расположенные в папке <JAVA_HOME>/jre/lib. Загрузчик является частью ядра JVM.</JAVA_HOME>
- Extensions class loader(загрузчик класса расширений) : загружает код в каталоги расширений <JAVA_HOME>/jre/lib/ext или каталог, указанный системным свойством java.ext.dirs.</JAVA_HOME>
- System class loader(системный загрузчик классов) : загружает код из java.class.path, который сопоставляется с переменной среды CLASSPATH. Реализуется классом sun.misc.Launcher$AppClassLoader.
Обязательные действия загрузчика классов :
- Загрузка : находит и импортирует двоичные данные для типа.
- Связывание : выполняет проверку(обеспечивает правильность импортируемого типа), подготовку(выделяет память для переменных класса и инициализирует память значениями по умолчанию) и разрешение(необязательно)(преобразует символические ссылки из типа в прямые ссылки)
- Инициализация : вызывает код Java, который инициализирует переменные класса их правильными начальными значениями.
JIT
Just in time - динамическая компиляция, компиляция «на лету» - технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или другой формат непосредственно во время работы программы.
Сборщик мусора (Garbage collector)
Способ автоматического управления памятью.
Действия :
- Находить мусор - неиспользуемые объекты. (Объект считается неиспользуемым, если ни одна из сущностей в коде, выполняемом в данный момент, не содержит ссылок на него, либо цепочка ссылок, которая могла бы связать объект с некоторой сущностью приложения, обрывается).
- Освобождать память от мусора.
Подходы обнаружения мусора :
- Reference counting( подсчёт ссылок).
Каждый объект имеет счётчик. Счётчик хранит информацию о том, сколько ссылок указывает на объект. Когда ссылка уничтожается, счётчик уменьшается. Если значение счетчика равно нулю, - объект можно считать мусором.
Минусы : сложность обеспечения точности счетчика( сложно выявлять циклические зависимости, когда два объекта ссылаются друг на друга, но ни один живой объект на них не ссылается, что приводит к утечкам памяти). - Tracing(трассировка).
Живыми могут считаться только те объекты, до которых можно добраться из корневых точек (GC Root) и те объекты, которые доступны из живого объекта. Все остальное мусор.
Типы корневых точек:
• локальные переменные и параметры методов
• потоки
• статические переменные
• ссылки из JNI
Методы очистки мусора
- Copying collectors :
Память делится на две части «from-space” и «to-space”.
• объекты создаются в «from-space”;
• когда «from-space” заполняется, приложение приостанавливается;
• запускается сборщик мусора, находятся живые объекты в «from-space” и копируются в «to-space”;
• когда все объекты скопированы «from-space” полностью очищаются;
• «to-space” и «form-space” меняются местами.
Плюсы:
• объекты плотно забивают память
Минусы:
• приложение останавливается на время для полного прохождения цикла сборки мусора
• когда все объекты живые, «form-space” и «to-space” будут обязаны быть одинакового размера - mark-and-sweep :
Алгоритм :
• объекты создаются в памяти;
• в момент, когда нужно запустить сборщик мусора, приложение приостанавливается;
• сборщик проходится по дереву объектов, помечая живые объекты;
• сборщик проходится по всей памяти, находя все не отмеченные куски памяти и сохраняя их в «free list”;
• когда новые объекты начинают создаваться, они создаются в памяти доступной во «free list”;
Минусы :
• приложение не работает пока происходит сборка мусора;
• время остановки напрямую зависит от размеров памяти и количества объектов;
• если не использовать «compacting” память будет использоваться неэффективно;
Сборщики мусора HotSpot VM используют комбинированный подход Generational Garbage Collection, который позволяет использовать разные алгоритмы для разных этапов сборки мусора. Этот подход опирается на: - большинство создаваемых объектов быстро становятся мусором;
- существует мало связей между объектами, которые были созданы в прошлом и только что созданными объектами;
Механизм сборки мусора
Процесс освобождения места в куче, для возможности добавления новых объектов. Объекты создаются посредством new, присваивая объекту ссылку. Для прекращения работы с обьектом достаточно перестать на него ссылаться :
- присвоив переменной ссылку на другой объект;
- присвоив значение null;
- прекратив выполнение метода, чтобы локальные переменные завершили своё существование;
Разновидности сборщиков мусора в виртуальной машине HotSpot
- Serial ( последовательный) - самый простой вариант доя приложения с небольшим объемом данных и не требовательных к задержкам, Используется редко, но на слабых машинах может быть выбран по умолчанию.
- Parallel (параллельный) - наследует подходы к сборке от последовательного сборщика, но добавляет параллелизм в некоторые операции, а так же возможности по автоматической подстройке под требуемые параметры производительности.
- Concurrent Mark Sweep (CMS) - нацелен на снижение максимальных задержек путём выполнения части работ по сборке мусора параллельно с основными потоками приложения. Подходит для работы с относительно большими объемами данных в памяти.
- Garbage-First (G1) - создан для замены CMS, особенно в серверных приложениях, работающих на многопроцессорных серверах и оперирующих большими объемами данных.
Виды памяти
Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта так же происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и в него могут ссылаться из любой части.
Stack (стек) это область хранения данных также находящаяся в общей оперативной памяти (RAM) только для одного потока. Всякий раз, когда вызывается метод, в памяти стека создаётся новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок так же перестаёт использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашёл-первый-вышел)
Различия Heap и Stack :
- Куча используется всеми частями приложения в то время как стек используется только одним потоком исполнения программы.
- Всякий раз, когда создаётся объект, он хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
-