CORE -1 Flashcards

1
Q

Что такое ООП?

A

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

Каждый объект содержит присущие ему данные (поля) и умеет выполнять действия (методы).

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

3 требования для ООП Программы

A
  • объектно-ориентированное программирование использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы;
  • каждый объект является экземпляром определенного класса;
  • классы образуют иерархии.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие преимущества у ООП?

A
  • Возможность легкой модификации (при грамотном анализе и проектировании)
  • Возможность отката при наличии версий
  • Более легкая расширяемость
  • Более естественная декомпозиция (разделение целого на части) программного обеспечения, которая существенно облегчает его разработку
  • Слабая связанность кода.
  • Сокращение количества межмодульных вызовов и уменьшение объемов информации, передаваемой между модулями.
  • Увеличивается показатель повторного использования кода.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Какие недостатки у ООП?

A
  • Потребление памяти - обьекты потребляют больше оперативной памяти, чем примитивные типы данных
  • Неэффективность и неэкономное распределения памяти на этапе выполнения (по причине издержек на динамическое связывание и проверки типов на этапе выполнения).
  • Излишняя универсальность. Часто содержится больше методов, чем это реально необходимо текущей программе. А поскольку лишние методы не могут быть удалены, они становятся мертвым грузом.
  • Сложно начать - парадигма ООП сложнее функционального программирования, поэтому на старт уходит больше времени
  • Резко увеличивается время на анализ и проектирование систем
  • Увеличение времени выполнения
  • Размер кода увеличивается
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Назовите основные принципы ООП

A
  • Инкапсуляция - сокрытие реализации.
  • Наследование - создание новой сущности на базе уже существующей.
  • Полиморфизм - возможность иметь разные формы для одной и той же сущности.
  • Абстракция - набор общих характеристик.
  • Посылка сообщений - форма связи, взаимодействия между сущностями.
  • Переиспользование - все озвученные принципы заточены под повторное использование кода.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое инкапсуляция?Пример

A

Это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя, открыв только то, что необходимо при последующем использовании.
*Модификаторы доступа:
(Access modifiers:
-private
-default (package visible)
-protected
-public)
* Геттеры и Сеттеры (Getters and Setters)

Внешние объекты и классы не имеют прямого доступа к полям объекта. Объект имеет внешние методы (API), позволяющие внешнему миру с ним взаимодействовать. Но каким образом работа выстроена внутри объекта - на это внешние пользователи влиять не должны.

Цель инкапсуляции - уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.

Состояние объекта - это значение всех его полей. Объект не должен изменяться чем то из вне, кроме своих методов.
Необходимо убрать возможность случайного/умышленного изменения объекта.

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

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

В Java инкапсуляция достигается с помощью определения private, protected и public полей и методов в классе. Поля и методы, объявленные как private, могут быть доступны только внутри класса и не могут быть изменены или прочитаны извне. Protected поля и методы могут быть доступны только внутри класса и его наследников. Public поля и методы могут быть доступны из любого места в программе.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое наследование?Пример

A

Наследование - свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью(поля и методы).
Класс, от которого производится наследование, называется предком, базовым или родительским.
Новый класс – потомком, наследником или производным классом.
class Employee extends Person {}
Запретить наследование - public final class.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое полиморфизм? Пример

A

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

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

Полиморфизм бывает динамическим (переопределение) и статическим (перегрузка).

**Животное[] –> {собака, кошка}.
Животное[1].голос –> “Гав”;
Животное[2].голос –> “Мяу”;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Преимущество полиморфизма

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Ключевая особенность полиморфизма

A

Использование объекта производного класса, вместо объекта базового (потомки могут изменять родительское поведение, даже если обращение к ним будет производиться по ссылке родительского типа).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Полиморфная переменная и функция

A

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

  • ad hoc, функция ведет себя по разному для разных типов аргументов (например, функция draw() — рисует по разному фигуры разных типов);
  • параметрический, функция ведет себя одинаково для аргументов разных типов (например, функция add() — одинаково кладет в контейнер элементы разных типов).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Абстрагирование и Абстракция

A

Абстрагирование - это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые.
Абстракция - это набор всех таких характеристик. (телефон звонил в 19 веке и в 21, функция выделена из разных сложных процессов).

Объект-класс-абстрактный класс-Интерфейс (макс. уровень абстракции).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Что представляет собой «обмен сообщениями»

A

Объекты взаимодействуют, посылая и получая сообщения.
Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
В ООП отправка сообщения (вызов метода) — это единственный путь передать управление объекту.
Если объект должен «отвечать» на это сообщение, то у него должна иметься соответствующий данному сообщению метод.
Так же объекты, используя свои методы, могут и сами посылать сообщения другим объектам. Обмен сообщениями реализуется с помощью динамических вызовов, что приводит к чрезвычайно позднему связыванию (extreme late binding).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое Класс?

A

Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).

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

С точки зрения структуры программы, класс является сложным типом данных.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Укажите, из каких элементов состоит класс.

A

1) Поля
2) Методы
3) Конструкторы
4) Статический и
5) динамический блоки инициализации.

Поля - хранилища данных.

Методы - операции, выполняемые классами.

Конструкторы - особые методы, работающие при создании экземпляра класса. Они инициализируют поля объекта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое Объект?

A

Объект (экземпляр) – это представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Что такое Интерфейс?

A

Интерфейс - набор всех публичных методов класса в совокупности с набором публичных атрибутов.

Интерфейс специфицирует класс, четко определяя все возможные действия над ним.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Что такое ассоциация?

A

Ассоциация обозначает связь между объектами.

Композиция и агрегация - частные случаи ассоциации часть-целое .

  • является(IS A) подразумевает наследование.
  • имеет(HAS A) подразумевает ассоциацию (агрегацию или композицию).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Что такое композиция?

A

Композиция - это метод проектирования, методика создания классов из уже существующих.
При композиции новый класс включает в себя прошлые, то есть реализуется отношение “has-a”.

Машина HAS-A Двигатель

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Что такое агрегация?

A

Агрегация - метод проектирования, менее строгий вариант композиции. Реализуется отношение “has-a”.
Но: время существования внутренних объектов не зависит от времени существования объекта-контейнера.
Агрегация предполагает, что объекты связаны взаимоотношением part-of (часть).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Реализация Агрегации и Композиции в Java?

A

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

Агрегация и Композиция реализуются в Java с помощью полей, ссылающихся на объекты других классов. Например:
~~~
class Auto {
Engine engine;
Wheel wheel;

}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Что такое связывание методов (binding)?

A

Связывание - это присоединение вызова метода к телу метода.

Иначе говоря - когда на строчке вызван метод, куда идти за инструкциями, что делать.
Существует:
* Раннее (статическое) связывание;
* Позднее (динамическое) связывание.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Что такое РАННЕЕ связывание методов (early binding)?

A

Раннее (статическое) связывание - проводится компилятором перед запуском программы- на этапе компиляции.
Вызываемый метод определяется по типу переменной.

Например, перегрузка методов; приватные, статические и final методы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Что такое ПОЗДНЕЕ связывание методов (late binding)?

A

Позднее (динамическое) связывание -проводится на этапе выполнения(runtime), в зависимости от типа объекта.

Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Какой тип связывания в Java используется для перегруженных методов? А для переопределенных методов?

A

1) Для перегруженных - раннее. Вызываемый метод определяется на этапе компиляции по типу переменной.
2) Для переопределенных - позднее. Метод определяется по типу объекта во время выполнения программы (Runtime).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Различия между ранним и поздним связыванием в Java

A

1) в языке Java Статическое связывание используется для перегруженных методов, динамическое для переопределенных.
2) Следовательно, приватные, статические и терминальные (final) методы разрешаются при помощи статического связывания, поскольку их нельзя переопределять, а все виртуальные методы разрешаются при помощи динамического связывания.
3) В статическом связывании для выбора метода используется тип ссылочной переменной, при динамическом связывании для нахождения нужного метода в Java используется конкретный объект.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

SOLID принципы

A

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

Введен Майклом Фэзерсом

S - Single Responsibility - Каждый класс должен отвечать за какую-то одну логику.
O - Open-Closed - описываемый класс должен быть открыт для расширения, но закрыт для изменений.
L - Liskov Substitution - Методы, использующие ссылки на базовые классы, должны иметь возможность использовать объекты классов-наследников, не зная об этом.
I - Interface Segregation - клиенты не должны быть вынуждены реализовывать методы, которые они не будут использовать..
D - Dependency Inversion - Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

SOLID: Single Responsibility

A

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

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

SOLID: Open Closed Principle

A
  • Классы должны быть открыты к расширению, и закрыты к модификации.
  • Это значит, что код должен быть написан так, чтобы другие разработчики могли изменить поведение существующего кода, при этом, не изменяя основной код.
  • То есть, классы должны быть такими, чтобы каждый мог дописать что-то своё, не меняя при этом содержимого исходного кода.
  • В хорошо спроектированных программах новая функциональность вводится путем добавления нового кода, а не изменением старого, уже работающего.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

SOLID: Liskov Substitution Principle

A
  • Используемый класс должен иметь возможность использовать базовый класс или любой подкласс, производный от базового, при этом не изменяя собственный код или логику работы, независимо от реализации.
  • То есть, родительский класс должен быть полностью взаимозаменяемым любыми его подклассами, при этом, клиентский код даже не должен знать о том, что мы работаем с каким-то подклассом, ему не должно быть разницы.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

SOLID: Interface Segregation Principle

A
  • Клиентский код не должен имплементировать интерфейсы, которые он не использует, не должен определять методы, которые ему не нужны.
  • Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более мелкие и специфические, чтобы клиенты мелких интерфейсов знали только о методах, необходимых в работе.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

SOLID: Dependency inversion Principle

A
  • Зависимости внутри системы строятся на основе абстракций.
    Объектом зависимости должна быть абстракция, а не что-то конкретное.
  • Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей.
  • Детали должны зависеть от абстракций.
  • Программное обеспечение нужно разрабатывать так, чтобы различные модули были автономными и соединялись друг с другом с помощью абстракции.

Классическое применение этого принципа — Spring framework. В рамках Spring framework все модули выполнены в виде отдельных компонентов, которые могут работать вместе. Они настолько автономны, что могут быть быть с такой же легкостью задействованы в других программных модулях помимо Spring framework. Это достигнуто за счет зависимости закрытых и открытых принципов. Все модули предоставляют доступ только к абстракции, которая может использоваться в другом модуле.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

Какая основная идея языка Java?

A

Кроссплатформенность, «написано/скомпилировано однажды, запускается везде» (compile once, run anywhere)

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

34
Q

За счет чего обеспечивается кроссплатформенность?

A

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

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

Сама JVM реализована для разных ОС.
Что байт код для JVM может исполняться везде где установлена JVM.
Код не нужно перекомпилировать под каждую из платформ.

35
Q

Какие преимущества у Java?

A
  • ООП
  • Безопасность
  • Кроссплатформенность
  • garbage collector
  • Многопоточность
  • Large developer community
  • Автоматическое управление памятью
    Разработчикам Java не нужно вручную писать код для управления памятью благодаря
    автоматическому управлению памятью (AMM).
36
Q

Какие недостатки у Java?

A
  • Платное коммерческое использование. Oracle с 2019 взимает плату за использование Java Standard Edition 8 в «коммерческих целях»
  • Низкая производительность (из-за компиляции и абстракции с помощью виртуальной машины, очистки памяти, взаимная блокировка потоков)
  • Отсутствие нативного дизайна для создания графического интерфейса пользователя (GUI). Есть Swing, SWT, JavaFX, JSF …но не катят.
  • Многословный и сложный код. длинные, чрезмерно сложные предложения затрудняют чтение и просмотр кода. Как и естественные языки, многие языки программирования высокого уровня содержат лишнюю информацию.
37
Q

Что такое JDK? Что в него входит?

A

JDK Комплект разработчика приложений на языке Java:

  • компилятор Java (Javac)
  • стандартные библиотеки классов Java, примеры, документацию, утилиты (вспомогательная компьютерная программа в составе общего программного обеспечения для выполнения специализированных типовых задач, связанных с работой оборудования и операционной системы)
  • исполнительную систему Java (JRE: Java Virtual Machine + библиотеки Java-классов).
38
Q

Что такое JRE? Что в него входит?

A

Runtime Environment.
JRE - это уровень ПО, работающий поверх ОС и предоставляющий дополнительные службы, специфичные для Java.
Она берет Java-код, объединяет его с необходимыми библиотеками и запускает JVM для его выполнения.

Включает:
- Class Loader
- Byte Code Verification
- JVM
- стандартный набор библиотек классов Java.

JRE не содержит инструменты для разработки (компилятор, отладчик и т.д).

39
Q

Что такое JVM?

A

JVM, Java Virtual Machine (Виртуальная машина Java) — основная часть JRE.

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

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

40
Q

Что такое byte code?

A

Bytecode - это скомпилированная форма программы, которая выполняется Java Virtual Machine (JVM), а не операционной системой хост-компьютера.

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

Машинно-независимый код низкого уровня.

Bytecode Java преобразуется в машинный код с помощью специального интерпретатора, называемого виртуальной машиной Java (Java Virtual Machine — JVM).

  1. Создается исходный документ (исходник) – файл c расширением .java.
  2. Исходник пропускается через компилятор, который проверяет код на ошибки и выдает конечный результат.
  3. Компилятор создает новый документ, закодированный с помощью байт-кода.c расширением .class. Любое устройство, способное выполнять Java, сможет интерпретировать этот файл в такой формат, который сможет запустить. Скомпилированный байт-код не зависит от платформы.
  4. Виртуальная машина считывает и выполняет байт-код.
41
Q

Что такое загрузчик классов (classloader)?

A

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

1) Любой класс для использования нужно загрузить из файла .class в JVM для работы.
2) Загрузкой занимается ClassLoader.
3) Некоторые базовые классы (из rt.jar) загружаются при старте приложения, остальные - по мере надобности.

42
Q

Какие стандартные загрузчики классов в Java вы знаете?

A

При запуске JVM, используются три загрузчика классов:

  • Bootstrap ClassLoader - базовый загрузчик загружает платформенные классы JDK из архива rt.jar
  • Extension ClassLoader - загрузчик расширений загружает классы расширений, которые по умолчанию находятся в каталоге jre/lib/ext.
  • AppClassLoader - системный загрузчик загружает классы приложения, определенные в CLASSPATH
43
Q

Что такое rt.jar?

A

Файл, содержащий классы, входящие в JRE:
* java.lang: включает в себя основные классы, необходимые для работы Java программы, такие как String, Math, System, Thread и т. д.
* java.io: предоставляет возможность ввода/вывода данных
* java.net: позволяет программам работать с сетью
* java.util: содержит утилиты и коллекции данных, такие как ArrayList, HashMap и т. д.
* javax.swing: содержит классы для создания графического пользовательского интерфейса.

44
Q

Расскажите про Bootstrap Classloader

A

1) Самый базовый загрузчик, нативный, реализован на уровне JVM.
2) Загружает классы из директории “$JAVA_HOME/jre/lib”, в том числе rt.jar (RunTime).
3) К нему нет доступа из исполняемой среды. String.class.getClassLoader == null.

Загружает основные системные и внутренние классы JDK (Core API - пакеты java.* (rt.jar и i18n.jar) . Важно заметить, что базовый загрузчик является «Изначальным» или «Корневым» и частью JVM, вследствие чего его нельзя создать внутри кода программы.

45
Q

Расскажите про Extension Classloader

A

1) Реализован на уровне JRE.
2) Загружает различные пакеты расширений, которые располагаются в директории <JAVA_HOME>/lib/ext или другой директории, описанной в системном параметре java.ext.dirs.
3) Загрузчик расширений реализован классом sun.misc.Launcher$ExtClassLoader.</JAVA_HOME>

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

46
Q

Расскажите про System Classloader

A

1) Реализован на уровне JRE.
2) Загружает классы, пути к которым указаны в переменной окружения CLASSPATH или пути, которые указаны в командной строке запуска JVM после ключей -classpath или -cp.
3) Системный загрузчик реализован классом sun.misc.Launcher$AppClassLoader.

47
Q

Что такое ClassPath?

A

Classpath - это параметр, указывающий, где находятся созданные пользователем (программистом) классы и пакеты. Откуда их загружать.

48
Q

Иерархия загрузчиков классов

A

До Java9:
Bootstrap -> Extension -> System.
Каждый загрузчик содержит ссылку на родителя, чтобы делегировать ему загрузку, если сам будет не в состоянии загрузить класс.

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

Как следствие поиск классов будет происходить в источниках в порядке их доверия: сначала в библиотеке Core API, потом в папке расширений, потом в локальных файлах CLASSPATH.

В случае неудачи генерится ClassNotFoundException
Bootstrap -> Extension -> System -> User-defined…
С Java9: Extension ClassLoader стал называться Platform ClassLoader, плюс появилась модульная структура.

49
Q

В каком порядке JVM ищет и загружает классы / какие загрузчики использует?

A

1) Фундаментальные классы (bootstrap loader): в основном java.lang.*
2) Расширяющие классы: (extension loader)
3) Пользовательские классы (system loader) - из переменной classpath.

50
Q

Какой способ загрузки классов реализует JVM?

A

JVM использует ленивую(LAZY) загрузку классов - по мере надобности.

Первоначально загружается только один класс. Как только код этого класса обращается к какому-то другому классу (любым способом: вызовом конструктора, обращением к статическому методу или полю), загружается другой класс.

51
Q

Что такое Current ClassLoader и Context ClassLoader?

A

Current Classloader — это загрузчик класса, код которого в данный момент исполняется.
Context Classloader — загрузчик контекста текущего потока. Иначе говоря - загрузчик того класса, в котором был создан данный объект потока.

52
Q

Как получить ClassLoader для класса?

A

1) Test.class.getClassLoader()

53
Q

Как получить ContextClassLoader для потока?

A

Thread.currentThread().getContextClassLoader()

54
Q

Что делает и что возвращает метод Class.forName(“…”)

A

1) Метод возвращает объект Class<?>, соответствующий переданному имени класса.
2) Если класс еще не загружен в JVM, то метод его загружает, используя текущий ClassLoader.
3) Есть такой же метод forName(), где явно можно указать другой ClassLoader.

55
Q

Этапы загрузки класса? (4)

A

Loading – поиск и физическая загрузка файла класса из определенного источника (в зависимости от загрузчика) . Этот процесс определяет базовое представление класса в памяти. На этом этапе такие понятия как «методы», «поля» и т. д. пока неизвестны.
Linking – приведение класса в run-time state (готов к исполнению).
Он может быть разбит на 3 части:
* Bytecode verification – проверка корректности полученного байт-кода.
* Class preparation – выделение оперативной памяти под статические поля и инициализация их значениями по умолчанию согласно их типу.
* Resolution (optional) – загрузка и линковка прочих классов, с которыми связан данный.
Initialization – вызов статических блоков инициализации и присваивание полям класса значений по умолчанию.
Хранение – класс хранится в кеше для дальнейшего использования

56
Q

Как получить экземпляр системного загрузчика?

A

ClassLoader.getSystemClassLoader()

57
Q

Расскажите про модель делегирования загрузки классов в JVM

A

1) Цель: загрузить классы максимально близким к базовому загрузчиком.
2) Клиент запрашивает загрузку класса - загрузчик перенаправляет это своему родителю, тот - своему и так до bootstrap.
3) Затем bootstrap пытается найти или загрузить класс у себя. Не нашел - передает потомку и так далее.

58
Q

Как инициировать загрузку требуемого класса?

A
  • явно: вызов ClassLoader.loadClass() или Class.forName() (по умолчанию
    используется загрузчик, создавший текущий класс, но есть возможность и явного указания загрузчика);
  • неявно: когда для дальнейшей работы приложения требуется ранее не использованный класс, JVM инициирует его загрузку.
59
Q

Что такое область видимости загрузчика классов?

A

Это множество классов, которые загрузил этот загрузчик. Каждый загрузчик ведет учет загруженных им классов.

60
Q

Что такое JIT?

A

JIT-компиляция (англ. Just-in-time compilation, компиляция «на лету»), динамическая компиляция (англ. dynamic translation) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы

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

61
Q

Виды ссылок в Java

A

1) Ссылки в Java — это указатели на объекты.
2) Иными словами, ссылка - переменная, содержащая адрес ячейки памяти, где хранится объект.
3) Ссылка может содержать значение null - это значит, что она не ссылается на ячейку в памяти.

  • сильные (strong reference) - запрещено удалять объект
  • мягкие (SoftReference) - удалять только при острой нехватке памяти. Подходят для кэша
  • слабые (WeakReference) - можно удалять в любой момент. Подходят для метаданных
  • фантомные (PhantomReference)- можно удалять в любой момент
    Особенности каждого типа ссылок связаны с работой
    Garbage Collector.
62
Q

Что такое Strong reference?

A

Strong reference - сильная ссылка. Она создается каждый раз, когда аллоцируем место в памяти через оператор new. Очистится сборщиком мусора не раньше, чем станет неиспользуемой

63
Q

Что такое SoftReference?

A

SoftReference – мягкая ссылка.
1) Soft Reference - один из типов ссылок на объект.
2) Если на объект ссылаются только Soft-ссылки, то Garbage Collector может удалить его при нехватке памяти.
3) Точнее - объект удаляется, если время его “мертвой” жизни (остались только Soft-ссылки) превысит заданное время на мегабайт свободной памяти.

64
Q

Что такое Weak Reference?

A

Weak Reference – слабая ссылка. Слабее мягкой.
1) Weak Reference - один из типов ссылок на объект.
2) Если на объект ссылаются только Weak-ссылки, то это сигнал GC удалить этот объект.

65
Q

Что такое PhantomReference?

A

Phantom Reference
представлены классом java.lang.ref.PhantomReference. Объект, на который указывают только
phantom-ссылки, может быть удален сборщиком в любой момент. Phantom-ссылка создается
точно так же, как weak или soft.

66
Q

Что такое сборщик мусора? (Garbage collector)

A

Механизм сборки мусора - это процесс освобождения места в куче, для возможности добавления новых объектов.
Объекты, ссылки на которые отсутствуют, принято называть мусором (garbage), который будет удален.
Сборщик мусора в Java - это компонент системы, отвечающий за автоматическое освобождение памяти.
Он работает в фоновом режиме и выполняется периодически, освобождая память, занятую объектами, к которым программа больше не имеет доступа, что предотвращает утечки памяти и обеспечивает стабильную работу программы.

Сборщик мусора Java использует алгоритмы,mark-and-sweep, copying, and generational collection, чтобы определить, какие объекты больше не нужны, и вернуть их память.
Это позволяет Java разработчикам сосредоточиться на написании кода, а не на управлении выделением и освобождением памяти вручную.

67
Q

Опишите процесс работы сборщика мусора?

A

1) Все новые объекты, за исключением очень больших, попадают в Young Generation. Очень большие - могут сразу попасть в Old.
2) В первую очередь сборщик собирает Young Generation. Объекты, которые пережили несколько сборок, могут быть “повышены” до Old Generation.
3) Объекты в Old Generation собираются тогда, когда памяти, очищенной в Young Generation, уже недостаточно.
4) Для сборки Young и Old Generation могут применяться разные алгоритмы - более быстрый или более “вдумчивый”, но освобождающий больше памяти.
5) Процесс сборки примерно таков:
— 5.1) Пометить все “живые” объекты.
— 5.2) Удалить из памяти все “мертвые” объекты.
— 5.3) (Желательно) Переставить оставшиеся объекты так, чтобы они компактно занимали одну область.
— 5.4) Получилась большая свободная область памяти для новых объектов.

68
Q

Какие принципиальные варианты дизайна сборщика мусора вы знаете?

A

Serial (последовательный) — самый простой вариант для приложений с небольшим объемом данных и не требовательных к задержкам. На данный момент используется сравнительно редко, но на слабых компьютерах может быть выбран виртуальной машиной в качестве сборщика по умолчанию. Использование Serial GC включается опцией -XX:+UseSerialGC.
Parallel (параллельный) — наследует подходы к сборке от последовательного сборщика, но добавляет параллелизм в некоторые операции, а также возможности по автоматической подстройке под требуемые параметры производительности. Параллельный сборщик включается опцией -XX:+UseParallelGC.
Параллельный уплотняющий (Parallel Compacting, Parallel Old)-XX:+UseParallelOldGC
Concurrent Mark Sweep (CMS) — нацелен на снижение максимальных задержек путем выполнения части работ по сборке мусора параллельно с основными потоками приложения. Подходит для работы с относительно большими объемами данных в памяти. Использование CMS GC включается опцией -XX:+UseConcMarkSweepGC.
Garbage-First (G1) — создан для замены CMS, особенно в серверных приложениях, работающих на многопроцессорных серверах и оперирующих большими объемами данных. G1 включается опцией Java -XX:+UseG1GC.

69
Q

Для чего объекты, создаваемые в heap делятся на поколения (generations)?

A

1) Объекты разные: есть простые, есть составные. Есть используемые один раз, есть живущие всю жизнь программы.
2) К разным объектам можно применять разные алгоритмы поиска их “живости” и очистки: быстрый, но не ко всем применимый или более долгий, но гарантированно работающий на всех.
3) Разделение на поколения позволяет использовать разные алгоритмы для разных объектов, тем самым уменьшая время паузы и потребление ресурсов.

70
Q

Какие поколения (generations) объектов используются в JVM?

A

1) Young generation. Сюда попадают не очень большие, недавно созданные объекты.
2) Old generation.
— 2.1) Если объекты из Young Generation пережили несколько “простых” сборок мусора, они “повышаются” до Old Generation и попадают сюда.
— 2.2) Также сюда могут попасть очень большие объекты.
— 2.3) Old generation коллекция больше, чем Young Generation и очищается реже.
3) Permanent generation. Здесь хранятся метаданные JVM: описания классов и методы.

71
Q

Что за алгоритм сборки мусора mark-sweep-compact?

A

1) Сначала размечаем живые и мертвые объекты.
2) Затем очищаем “мертвые” объекты.
3) Затем происходит дефрагментация живых объектов, смещая их в одно место. Тем самым, свободное место превращается в один большой свободный блок.

72
Q

Когда приложение выбрасывает OutOfMemoryError?

A

1) Ошибка OutOfMemoryError выбрасывается, когда в памяти (heap) недостаточно места, чтобы разместить объект.
2) Иначе говоря, сборщик мусора не во состоянии создать достаточно свободного места.

73
Q

Какие типы памяти в JVM вы знаете?

A

1) Heap
2) Stack
3) MetaSpace (с Java8).
4) До Java8 вместо MetaSpace была область PermGen в Heap.

74
Q

Расскажите про тип памяти Heap.

A

1) Heap (“куча”) - область памяти, выделенная JVM для размещения объектов.
2) Абсолютно все объекты, созданные в ходе работы приложения, размещаются в heap.
3) Мертвые объекты собираются сборщиком мусора.
4) Обычно делится на Young и Old Generation.
5) Работает медленнее, чем Stack память.
6) Если нет места под объект после сборки мусора, выкидывается OutOfMemoryException.

Для определения начального и максимального размера памяти в куче используются опции
JVM -Xms и -Xmx.

75
Q

Расскажите про тип памяти Stack.

A

1) Stack (стек) - область памяти для хранения ЛОКАЛЬНЫХ переменных, создаваемых в методе.
2) Если локально создается объект, то сам объект помещается в Heap, а ссылка на него - в Stack.
3) Stack значительно меньше, чем Heap, скорость доступа - значительно быстрее.
4) Если память стека полностью занята (н-р бесконечная рекурсия), выбрасывается StackOverflowException.
5) Память Stack не требует сборщика мусора - блок полностью очищается при выходе из метода.
6.1) Устройство: по принципу LIFO. Вызван метод - ему выделяется блок стек-памяти и кладется “сверху”.
6.2) Внутри вызван подметод - выделяется еще блок памяти и кладется “сверху”.
6.3) Всегда доступен только последний, самый “верхний” блок памяти.
6.4) Метод отработал - его верхний блок памяти очищается, становится доступен более нижний блок - обрамляющего метода.

76
Q

Что такое MetaSpace? Когда оно появилось? Почему она нужна в наши дни?

A

1) MetaSpace - область памяти, отдельная от Heap. Зарезервирована JVM для размещения классов, методов, статических переменных.
2) MetaSpace отделена от основной памяти JVM. Умеет автоматически расширяться, пока позволяет операционная система (или до заданного макс. значения).
3) MetaSpace появилась в Java 8+ как замена PermGen.
4) MetaSpace проверяется сборщиком мусора на “мертвые объекты”.
5) Раньше класс загружался вместе с JVM и умирал с ее выключением. Сейчас есть динамическая загрузка/выгрузка классов в ходе жизни JVM. Отсюда - нужна сборка “мертвых” классов и расширение под добавленные.

77
Q

Опишите сборщик мусора - Serial Collector

A

1) Serial Collector - однопоточный, копирующий, stop-the-world сборщик.
2) Собирает Young Generation, копируя объекты из блоков Eden и From в To.
3) Собирает Old Generation с помощью mark-sweep-compact.

78
Q

Опишите сборщик мусора - Parallel.

A

1) Parallel Collector - копирующий, stop-the world. Уменьшает pause time по сравнению с Serial за счет многопоточности при сборке Young Generation.
2) Собирает Young Generation, копируя объекты из блоков Eden и From в To. Применяет для этого несколько потоков, тем самым сильно уменьшая pause time.
3) Собирает Old Generation с помощью mark-sweep-compact. Как и в Serial Collector.

79
Q

Опишите сборщик мусора - Parallel Compacting (Parallel Old).

A

1) Parallel Compacting Collector - копирующий, stop-the world. То же, что Parallel Collector, но применяет многопоточность не только при сборке Young Generation, но и при сборке Old Generation.
2) Собирает Young Generation, копируя объекты из блоков Eden и From в To. Применяет для этого несколько потоков, тем самым сильно уменьшая pause time.
3) Собирает Old Generation с помощью mark-sweep-compact. Делит Old Generation на области для потоков, затем потоки очищают место, затем делает compact свободного места (уже в один поток).

80
Q

Опишите сборщик мусора - Concurrent Mark-Sweep (CMS).

A

1) Основная задача CMS Collector - уменьшить время паузы, пусть за счет увеличенного общего времени работы приложения.
2) Young Generation собирается ровно так же, как в Parallel Collector - копирование, Eden, From, To.
3) Сбор Old Generation разбивается на фазы:
— 3.1) Начальная метка (Initial mark) - короткая stop-the-world, помечаются “живые” объекты, на которые напрямую ссылается приложение.
— 3.2) Параллельная приложению Marking Phase - проход по ссылкам помеченных объектов и пометка “живыми” объектов, на которые ссылаются помеченные объекты.
— 3.3) Короткая stop-the world фаза Remark. Еще раз пройтись по всем помеченным объектам и проверить, что они не умерли, пока шла предыдущая фаза.
— 3.4) Наконец, идет параллельная приложению Sweep Phase, во время которой помеченные объекты очищаются, освобождая место.
—- 3.5) Фазы Compact у этого коллектора нет - и в этом его большой минус.

81
Q

Опишите сборщик мусора - G1 (Garbage First).

A

1) Коллектор G1 является заменой Concurent Mark-Sweep (CMS) коллектора и коллектором по-умолчанию с Java 9.
2) Два главных отличия от CMS: (1) Коллектор G1 группирует живые объекты (compacting), не допуская большой фрагментации памяти. (2) Коллектор стремится минимизировать stop-the-world паузы и делает их меньше, чем CMS, за счет разбивания Old Generation на регионы.
3) Коллектор многопоточный, использует параллельные алгоритмы, разбивает память на набор регионов.
4) Каждый регион может быть частью Young или Old generation - по мере надобности.
5) В первую очередь G1 старается освобождать память в регионах с малым количеством живых объектов - отсюда - “Garbage first”.
6) Процесс сбора Young Generation и Old Generation в регионе мало чем отличается от работы CMS. В Young идет копирование из региона Eden в другой регион Survivor (аналог To). В Old идет initial mark, concurrent mark, remark. Только вместо concurrent sweep идет concurrent copy живых объектов в другой регион, за счет чего и происходит уплотнение.

82
Q

Расскажите про класс ReferenceQueue

A

1) Класс ReferenceQueue - очередь, в которую помещаются объекты ссылок после удаления их объекта сборщиком мусора.
2) Объект ReferenceQueue мы можем передать в конструкторе при создании объекта ссылки.
3) В классе имеются стандартные методы poll() и remove(). Если нет следующего объекта, то poll() сразу возвращает null, а remove() ждет.