Что такое пул строк в Java?
Очень часто этот вопрос задают джунам и интернам на собеседованиях.
Пул строк (String Pool) – это множество строк в кучи (Java Heap memory). Мы знаем, что String – особый класс в java, с помощью которого мы можем создавать строковые объекты. Строковый пул возможен только потому, что строки в Java неизменные.
На картинке мы видим как именно строковый пул расположен в памяти Java Heap. И как разные способы создания строк влияют на расположение их в памяти.
Очень часто этот вопрос задают джунам и интернам на собеседованиях.
Пул строк (String Pool) – это множество строк в кучи (Java Heap memory). Мы знаем, что String – особый класс в java, с помощью которого мы можем создавать строковые объекты. Строковый пул возможен только потому, что строки в Java неизменные.
На картинке мы видим как именно строковый пул расположен в памяти Java Heap. И как разные способы создания строк влияют на расположение их в памяти.
🔥5👍3⚡1❤1
Конструктор в Java
Конструктор – это специальный метод, который используется при создании экземпляра класса.
Конструктор создает своеобразный “каркас” класса, которому каждый новый объект класса должен соответствовать.
Под капотом метода конструктора полям нашего будущего созданного объекта присваиваются переданные в аргументы конструктора значения.
Для примера возьмем класс Car (машина) с двумя полями (модель, например, "Bugatti Veyron" и максимальная скорость). Тогда объект класса Car можно создать при помощи конструктора:
Конструктор – это специальный метод, который используется при создании экземпляра класса.
Конструктор создает своеобразный “каркас” класса, которому каждый новый объект класса должен соответствовать.
Под капотом метода конструктора полям нашего будущего созданного объекта присваиваются переданные в аргументы конструктора значения.
Для примера возьмем класс Car (машина) с двумя полями (модель, например, "Bugatti Veyron" и максимальная скорость). Тогда объект класса Car можно создать при помощи конструктора:
👍5🔥2👌1🤓1
Конструктор по умолчанию в Java
Конструктор по умолчанию (default constructor) – это конструктор, который не имеет параметров. Конструктор по умолчанию может объявляться в классе явным образом или генерироваться автоматически.
Если в классе не объявить ни одного конструктора, то будет генерироваться конструктор по умолчанию. То есть конструктор по умолчанию генерируется в классе автоматически только в том случае, если класс не содержит реализации других конструкторов. Если класс содержит реализацию хотя бы одного конструктора с параметрами, то чтобы объявить конструктор по умолчанию, его нужно объявлять в классе явным образом.
Конструктор по умолчанию (default constructor) – это конструктор, который не имеет параметров. Конструктор по умолчанию может объявляться в классе явным образом или генерироваться автоматически.
Если в классе не объявить ни одного конструктора, то будет генерироваться конструктор по умолчанию. То есть конструктор по умолчанию генерируется в классе автоматически только в том случае, если класс не содержит реализации других конструкторов. Если класс содержит реализацию хотя бы одного конструктора с параметрами, то чтобы объявить конструктор по умолчанию, его нужно объявлять в классе явным образом.
👍3🔥2⚡1🥰1👌1🫡1
Что такое SCRUM?
SCRUM – это гибкая (Agile) методология организации совместного рабочего процесса, в основе которой – поэтапная разработка и совершенствование продукта небольшой командой специалистов различного профиля.
Одна из основных составляющих SCRUM это Sprint. Спринт – период, в течение которого команда создает и совершенствует отдельную часть продукта, чтобы быть готовым к изменениям и исключить глобальную доработку.
Каждый спринт начинается с планирования. Команда оценивает предстоящую работу, подбирает продолжительность цикла (около двух недель).
Задачи помещаются в Sprint Backlog.
Ежедневно вся команда собирается на 15 минут (daily stand up) для того, чтобы узнать, кто что делал вчера и чем занимается сейчас, а также что мешает выполнению задачи.
В конце цикла вся команда, включая владельца продукта и Scrum–мастера, собирается для демонстрации (demo) результатов работы.
На Sprint Retrospective команда обсуждает проблемы, с которыми столкнулась во время работы, а также пути их решения.
SCRUM – это гибкая (Agile) методология организации совместного рабочего процесса, в основе которой – поэтапная разработка и совершенствование продукта небольшой командой специалистов различного профиля.
Одна из основных составляющих SCRUM это Sprint. Спринт – период, в течение которого команда создает и совершенствует отдельную часть продукта, чтобы быть готовым к изменениям и исключить глобальную доработку.
Каждый спринт начинается с планирования. Команда оценивает предстоящую работу, подбирает продолжительность цикла (около двух недель).
Задачи помещаются в Sprint Backlog.
Ежедневно вся команда собирается на 15 минут (daily stand up) для того, чтобы узнать, кто что делал вчера и чем занимается сейчас, а также что мешает выполнению задачи.
В конце цикла вся команда, включая владельца продукта и Scrum–мастера, собирается для демонстрации (demo) результатов работы.
На Sprint Retrospective команда обсуждает проблемы, с которыми столкнулась во время работы, а также пути их решения.
👍5⚡1❤🔥1🔥1👨💻1
Для чего используется Jira?
Jira – это программный инструмент для управления проектами, разработанный компанией Atlassian. Jira часто используется в IT–компаниях для формирования списка задач, отслеживания общего прогресса команды и решения возникающих по ходу разработки продукта проблем.
Приложение Atlassian построено по принципам канбан / скрам–досок.
Канбан – это методика планирования задач, разработанная в сороковых годах. Суть канбан–доски заключается в наглядном расположении задач в соответствии с их статусом. Типичная доска делится на 3 колонки:
– Задачи, которые необходимо выполнить (обычный TODO–лист);
– Задачи, которые в текущий момент находятся в работе;
– Задачи, которые уже выполнены и висят на доске исключительно для отслеживания прогресса.
Но доску можно дополнить и своими колонками. Например, в отдельный блок вынести реализованные функции, проходящие стадию проверки. Сценариев масса: можно приспособить канбан под что угодно, вплоть до семейного списка покупок на холодильнике.
Jira – это программный инструмент для управления проектами, разработанный компанией Atlassian. Jira часто используется в IT–компаниях для формирования списка задач, отслеживания общего прогресса команды и решения возникающих по ходу разработки продукта проблем.
Приложение Atlassian построено по принципам канбан / скрам–досок.
Канбан – это методика планирования задач, разработанная в сороковых годах. Суть канбан–доски заключается в наглядном расположении задач в соответствии с их статусом. Типичная доска делится на 3 колонки:
– Задачи, которые необходимо выполнить (обычный TODO–лист);
– Задачи, которые в текущий момент находятся в работе;
– Задачи, которые уже выполнены и висят на доске исключительно для отслеживания прогресса.
Но доску можно дополнить и своими колонками. Например, в отдельный блок вынести реализованные функции, проходящие стадию проверки. Сценариев масса: можно приспособить канбан под что угодно, вплоть до семейного списка покупок на холодильнике.
❤2❤🔥2👍2⚡1🔥1🫡1
Чем отличается HTTP от HTTPs?
HTTP использует в работе порт 80, а HTTPs — порт 443. Так принято для удобства. Но главное отличие этих двух протоколов в том, что по HTTPs безопасно передавать личные данные, а по HTTP — нет.
Если злоумышленник перехватит трафик, отправленный по протоколу HTTP, он сможет увидеть всё, что вы ввели на сайте: контактную информацию, логин и пароль, детали банковской карты. Чтобы не раскрыть конфиденциальные данные, нужно вводить их только на тех сайтах, которые работают по HTTPs. Используемый протокол всегда можно посмотреть в адресной строке браузера.
Если перехватят трафик, отправленный по протоколу HTTPs, сообщение будет выглядеть как набор случайных символов. Чтобы его прочитать, нужен ключ. Но их специально делают такими длинными, что даже у самого мощного компьютера ушли бы годы непрерывной работы, чтобы их подобрать.
HTTP использует в работе порт 80, а HTTPs — порт 443. Так принято для удобства. Но главное отличие этих двух протоколов в том, что по HTTPs безопасно передавать личные данные, а по HTTP — нет.
Если злоумышленник перехватит трафик, отправленный по протоколу HTTP, он сможет увидеть всё, что вы ввели на сайте: контактную информацию, логин и пароль, детали банковской карты. Чтобы не раскрыть конфиденциальные данные, нужно вводить их только на тех сайтах, которые работают по HTTPs. Используемый протокол всегда можно посмотреть в адресной строке браузера.
Если перехватят трафик, отправленный по протоколу HTTPs, сообщение будет выглядеть как набор случайных символов. Чтобы его прочитать, нужен ключ. Но их специально делают такими длинными, что даже у самого мощного компьютера ушли бы годы непрерывной работы, чтобы их подобрать.
👍10🔥1👨💻1
Что такое коды состояния HTTP и зачем они нужны?
Код состояния HTTP (англ. HTTP status code) – это трёхзначное число, с которого начинается любой ответ сервера на запрос по протоколу HTTP. Код кратко сообщает суть ответа – был ли выполнен запрос или возникла ошибка.
В зависимости от кода ответа посетитель сайта или пользователь приложения либо будет видеть содержимое страницы и результат какого-то действия, либо не будет. Например, код ответа 200 будет означать, что всё хорошо и сервер отправит контент клиенту, а код 403 будет означать, что доступ к контенту запрещён и сервер ничего не отправит клиенту.
Коды ответов HTTP делятся на пять классов. В каждом из них объединены сообщения с похожими значениями. Вот краткие описания каждого из классов:
1хх – информационные коды. Сообщают о прогрессе выполнения запроса. На практике практически не встречаются;
2хх – коды успешно выполненных запросов. Сообщают о том, что всё в порядке и работает, как ожидалось;
3хх – коды перенаправлений. Сообщают о том, что запрашиваемая страница переехала и нужно сделать ещё один запрос по новому URL;
4хх – коды ошибок клиента. Сообщают об ошибке на стороне пользователя, который отправил запрос;
5хх – коды ошибок сервера. Сообщают об ошибке на стороне сервера, который обрабатывал запрос.
Код состояния HTTP (англ. HTTP status code) – это трёхзначное число, с которого начинается любой ответ сервера на запрос по протоколу HTTP. Код кратко сообщает суть ответа – был ли выполнен запрос или возникла ошибка.
В зависимости от кода ответа посетитель сайта или пользователь приложения либо будет видеть содержимое страницы и результат какого-то действия, либо не будет. Например, код ответа 200 будет означать, что всё хорошо и сервер отправит контент клиенту, а код 403 будет означать, что доступ к контенту запрещён и сервер ничего не отправит клиенту.
Коды ответов HTTP делятся на пять классов. В каждом из них объединены сообщения с похожими значениями. Вот краткие описания каждого из классов:
1хх – информационные коды. Сообщают о прогрессе выполнения запроса. На практике практически не встречаются;
2хх – коды успешно выполненных запросов. Сообщают о том, что всё в порядке и работает, как ожидалось;
3хх – коды перенаправлений. Сообщают о том, что запрашиваемая страница переехала и нужно сделать ещё один запрос по новому URL;
4хх – коды ошибок клиента. Сообщают об ошибке на стороне пользователя, который отправил запрос;
5хх – коды ошибок сервера. Сообщают об ошибке на стороне сервера, который обрабатывал запрос.
👍6✍2🔥1👨💻1🫡1
Что такое Garbage Collector в Java?
Перейдем с вами к большой теме под названием Garbage Collector.
Поиском и освобождением ненужных участков в памяти в JVM занимается специальный процесс, который называется Garbage Collector или коротко GC. У Garbage Collector всего две задачи – это обнаружение и очистка мусора.
Мусор – это структура данных (объект) в памяти не достижимый из программного кода.
Существует несколько реализаций GC, работающих по различным алгоритмам, каждый из которых по своему решает проблему отслеживания и уничтожения уже ненужных объектов (рассмотрим разные реализации в будущих постах).
По спецификации нет никаких правил для реализации GC, кроме соблюдения корректности – это значит, что нельзя собирать объекты, которые в будущем в приложении будут использоваться.
Я уже много раз сказал слово "ненужные" объекты. Но как определить, что объект не нужен, что объект не используется и это мусор?
Существует несколько подходов для поиска мусора:
– Reference counting
– Tracing
Поговорим об этих подходах в следующих постах.
Перейдем с вами к большой теме под названием Garbage Collector.
Поиском и освобождением ненужных участков в памяти в JVM занимается специальный процесс, который называется Garbage Collector или коротко GC. У Garbage Collector всего две задачи – это обнаружение и очистка мусора.
Мусор – это структура данных (объект) в памяти не достижимый из программного кода.
Существует несколько реализаций GC, работающих по различным алгоритмам, каждый из которых по своему решает проблему отслеживания и уничтожения уже ненужных объектов (рассмотрим разные реализации в будущих постах).
По спецификации нет никаких правил для реализации GC, кроме соблюдения корректности – это значит, что нельзя собирать объекты, которые в будущем в приложении будут использоваться.
Я уже много раз сказал слово "ненужные" объекты. Но как определить, что объект не нужен, что объект не используется и это мусор?
Существует несколько подходов для поиска мусора:
– Reference counting
– Tracing
Поговорим об этих подходах в следующих постах.
👍8🔥4❤2👨💻1🫡1
Garbage Collector. Reference Counting. Часть 1.
Данный подход основан на подсчете ссылок, о чем можно догадаться из названия.
Суть подхода состоит в том, что каждый объект имеет некоторый счетчик. Этот счетчик хранит информацию о том, сколько ссылок указывает на объект. Kогда какая-либо ссылка уничтожается, то и значение счетчика уменьшается.
Если значение счетчика равно нулю – объект можно считать мусором и память, которую он занимает, можно очищать.
Как это выглядит, можно посмотреть на картинке.
Из плюсов данного подхода можно выделить несколько: простота, не требуются долгие паузы для сборки мусора.
Однако, есть и существенные минусы:
– Плохо сочетается с многопоточностью;
– Сложно выявлять циклические зависимости;
– Влияет на производительность – каждый раз, когда мы что-то читаем, записываем ссылку на объект в локальную переменную, нам нужно увеличивать счетчик.
Благодаря своим минусам данный подход не используется и вытеснен более гибким подходом, под названием Tracing.
Данный подход основан на подсчете ссылок, о чем можно догадаться из названия.
Суть подхода состоит в том, что каждый объект имеет некоторый счетчик. Этот счетчик хранит информацию о том, сколько ссылок указывает на объект. Kогда какая-либо ссылка уничтожается, то и значение счетчика уменьшается.
Если значение счетчика равно нулю – объект можно считать мусором и память, которую он занимает, можно очищать.
Как это выглядит, можно посмотреть на картинке.
Из плюсов данного подхода можно выделить несколько: простота, не требуются долгие паузы для сборки мусора.
Однако, есть и существенные минусы:
– Плохо сочетается с многопоточностью;
– Сложно выявлять циклические зависимости;
– Влияет на производительность – каждый раз, когда мы что-то читаем, записываем ссылку на объект в локальную переменную, нам нужно увеличивать счетчик.
Благодаря своим минусам данный подход не используется и вытеснен более гибким подходом, под названием Tracing.
👍3👨💻3🔥2✍1🫡1
Garbage Collector. Reference Counting. Часть 2.
Одним из минусов подхода Reference Counting является сложность выявления циклических зависимостей.
Циклические зависимости – когда два объекта указывают друг на друга, но ни одна ссылка из Stack на них не ссылается. Это приводит к утечкам памяти. Наглядно можно посмотреть на картинке – каждый из объектов на рисунке имеет по одной ссылке на себя, однако только один является по-настоящему "живым" и нужным.
Одним из минусов подхода Reference Counting является сложность выявления циклических зависимостей.
Циклические зависимости – когда два объекта указывают друг на друга, но ни одна ссылка из Stack на них не ссылается. Это приводит к утечкам памяти. Наглядно можно посмотреть на картинке – каждый из объектов на рисунке имеет по одной ссылке на себя, однако только один является по-настоящему "живым" и нужным.
👍3🔥2👌2✍1👨💻1🫡1
Garbage Collector. Tracing.
Этот подход поиска мусора в Java вводит новое понятие – GC Root или корень, якорь (чуть дальше я поясню, что это такое).
Главную идею подхода можно сформулировать как:
Живые объекты – это те, до которых мы можем добраться от корня (GC Root), в то время как все остальные являются мусором.
Всё, что доступно с живого объекта, – также живое.
Пусть у нас есть следующий код:
Person p = new Person();
p.setFlat(new Flat());
p.setCar(new Car());
p.getCar().setEngine(new Engine());
p.getCar().setHorn(new Horn());
Применимо к тому, о чем мы сейчас говорим, выглядеть это будет как на картинках.
Так вот Person – это и есть тот самый корень, якорь. Т.е это наивысшая точка графа связанных объектов.
Так как Person у нас является живым объектом, то считается, что все объекты, до которых мы можем добраться из Person – также живые.
О том, какие бывают GC Root поговорим в следующем посте.
Этот подход поиска мусора в Java вводит новое понятие – GC Root или корень, якорь (чуть дальше я поясню, что это такое).
Главную идею подхода можно сформулировать как:
Живые объекты – это те, до которых мы можем добраться от корня (GC Root), в то время как все остальные являются мусором.
Всё, что доступно с живого объекта, – также живое.
Пусть у нас есть следующий код:
Person p = new Person();
p.setFlat(new Flat());
p.setCar(new Car());
p.getCar().setEngine(new Engine());
p.getCar().setHorn(new Horn());
Применимо к тому, о чем мы сейчас говорим, выглядеть это будет как на картинках.
Так вот Person – это и есть тот самый корень, якорь. Т.е это наивысшая точка графа связанных объектов.
Так как Person у нас является живым объектом, то считается, что все объекты, до которых мы можем добраться из Person – также живые.
О том, какие бывают GC Root поговорим в следующем посте.
🔥4✍2👍2🤓1👨💻1🫡1
На собеседованиях Java–разработчиков и стажеров часто спрашивают о том, какие бывают GC Root?
Как мы уже поняли из предыдущего поста с примером c Person – локальные переменные являются GC Root.
Компилятор вычисляет для всех переменных live ranges – это всё, что находится на любых путях исполнения от определения переменной до последнего использования (или использований, они могут быть разные на разных путях).
Другими словами, компилятор всегда знает: жива сейчас переменная или нет, могут ее потенциально в будущем еще использовать или нет.
GC тоже ориентируется на это знание от компилятора. Если переменная вне своего live range, то значит она уже не будет корнем.
Но что еще может быть корневой точкой?
Корневой точкой могут быть:
– Локальные переменные и параметры методов;
– Потоки Java;
– Статические переменные;
– Ссылки из JNI.
Из этого следует, что даже самое простое java приложение имеет следующие GC Root:
– Локальные переменные внутри main метода;
– Статические переменные класса, содержащего main метод;
– Параметры main метода;
– Поток, который выполняет main метод.
Как мы уже поняли из предыдущего поста с примером c Person – локальные переменные являются GC Root.
Компилятор вычисляет для всех переменных live ranges – это всё, что находится на любых путях исполнения от определения переменной до последнего использования (или использований, они могут быть разные на разных путях).
Другими словами, компилятор всегда знает: жива сейчас переменная или нет, могут ее потенциально в будущем еще использовать или нет.
GC тоже ориентируется на это знание от компилятора. Если переменная вне своего live range, то значит она уже не будет корнем.
Но что еще может быть корневой точкой?
Корневой точкой могут быть:
– Локальные переменные и параметры методов;
– Потоки Java;
– Статические переменные;
– Ссылки из JNI.
Из этого следует, что даже самое простое java приложение имеет следующие GC Root:
– Локальные переменные внутри main метода;
– Статические переменные класса, содержащего main метод;
– Параметры main метода;
– Поток, который выполняет main метод.
👍5❤1⚡1✍1🤩1👨💻1🫡1
Алгоритмы очистки памяти. Copying collectors.
Очистка памяти процесс довольно сложный, поэтому было также разработано несколько алгоритмов, выполняющих эту задачу.
Рассмотрим Copying collectors.
Память условно делится на две области: from–space и to–space.
Все объекты создаются в области from–space, по мере заполнения этой области запускается очистка мусора. Приложение полностью останавливается – происходит так называемый stop–the–world – в момент начала очистки, после чего все "живые" объекты в from–space копируются в to–space.
После того, как все "живые" объекты скопированы происходит полная очистка from–space и области меняются местами.
Stop–the–World – это остановка любой мутирующей heap активности.
Из плюсов можно выделить то, что объекты плотно забивают память, поэтому tracing происходит быстрее.
Из минусов можно отметить полную остановку приложения и то, что у нас одна область памяти, по сути, не используется, а при большом количестве объектов это проблема.
Для тех приложений, где пауза критична существует такое понятие как инкрементальная сборка. Там мы делаем большое количество кратковременных пауз. Это выражается в большей нагрузке на приложение.
Примером инкрементального сборщика может являться CMS GC.
Перечисленные минусы довольно весомые, поэтому сейчас данный алгоритм практически не используется.
Очистка памяти процесс довольно сложный, поэтому было также разработано несколько алгоритмов, выполняющих эту задачу.
Рассмотрим Copying collectors.
Память условно делится на две области: from–space и to–space.
Все объекты создаются в области from–space, по мере заполнения этой области запускается очистка мусора. Приложение полностью останавливается – происходит так называемый stop–the–world – в момент начала очистки, после чего все "живые" объекты в from–space копируются в to–space.
После того, как все "живые" объекты скопированы происходит полная очистка from–space и области меняются местами.
Stop–the–World – это остановка любой мутирующей heap активности.
Из плюсов можно выделить то, что объекты плотно забивают память, поэтому tracing происходит быстрее.
Из минусов можно отметить полную остановку приложения и то, что у нас одна область памяти, по сути, не используется, а при большом количестве объектов это проблема.
Для тех приложений, где пауза критична существует такое понятие как инкрементальная сборка. Там мы делаем большое количество кратковременных пауз. Это выражается в большей нагрузке на приложение.
Примером инкрементального сборщика может являться CMS GC.
Перечисленные минусы довольно весомые, поэтому сейчас данный алгоритм практически не используется.
👍5❤2🔥2✍1🫡1🆒1