Java 15: sealed classes
В сентябре выйдет Java 15 с новой фичей: sealed classes.
Sealed классы и интерфейсы явно определяют список наследников:
Плюс в java.lang.Class добавилось два метода:
Глобальная цель - поддержка pattern matching. Чтобы вместо
При реализации паттерна State. Раньше конечный набор состояний выражался только через enum:
❌ Значения в конструкторе жёстко задаются на этапе компиляции.
✅ Каждое состояние в отдельном файле.
✅ Экземпляры создаются во время работы программы. Конструктор принимает параметры, а не константы.
В сентябре выйдет Java 15 с новой фичей: sealed classes.
Sealed классы и интерфейсы явно определяют список наследников:
public sealed class ShapeКлассы, которых нет в блоке permits, не могут наследоваться от sealed класса. Проверка идёт во время компиляции или в IDE. В Intellij IDEA уже в июле добавили поддержку sealed типов.
permits Circle, Rectangle
Плюс в java.lang.Class добавилось два метода:
🔸ClassDesc[] getPermittedSubclasses()❓Зачем?
🔸boolean isSealed()
Глобальная цель - поддержка pattern matching. Чтобы вместо
if (s instanceof Circle) {…}
else if (s instanceof Rectangle) {…}
использовать switch:switch (s) {
case Circle c -> …
case Rectangle r -> …
❓Где пригодятся sealed классы?При реализации паттерна State. Раньше конечный набор состояний выражался только через enum:
enum State {NEW, VERIFIED;}
❌ Все элементы и методы хранятся вместе. Если методов много, то размер файла растёт, и читаемость снижается.❌ Значения в конструкторе жёстко задаются на этапе компиляции.
enum State {
NEW(12);
int rating;
State(int rating) {…}
}
Теперь с помощью sealed класса:✅ Каждое состояние в отдельном файле.
✅ Экземпляры создаются во время работы программы. Конструктор принимает параметры, а не константы.
👍2
Intellij IDEA: редактирование кода
Несколько простых приёмов для быстрой работы.
Легендарные комбинации
работают со всей строкой, на которой стоит курсор, не нужно ничего выделять.
Удалить всю строку:
Чтобы переместить выделенный код:
Несколько простых приёмов для быстрой работы.
Легендарные комбинации
Ctrl + C
Ctrl + V
Ctrl + X работают со всей строкой, на которой стоит курсор, не нужно ничего выделять.
Удалить всю строку:
Ctrl + YДублировать строку:
Ctrl + DЧтобы выделить часть кода:
Ctrl + WПри каждом нажатии W захватывается всё большая область.
Чтобы переместить выделенный код:
Ctrl + Shift + ⬆️
Ctrl + Shift + ⬇️👍2
У вас крупная система: 30 микросервисов и 200 серверов, всё на java 8. Вы решили перейти на более новую версию в течение месяца. В сентябре выйдет java 15. На какую версию запланируете переход?
Anonymous Poll
6%
Java 9
65%
Java 11
17%
Java 14
12%
Java 15
Релизный цикл в java
15 сентября выйдет новая java — версия под номером 15. В этом посте разберёмся, каковы шансы увидеть её на вашем продакшене.
Java — распространённый язык, и требования к каждому релизу высоки. Ожидается, что новая версия будет удобной и быстро работать на всех процессорах. Разработка и тестирование занимают время, поэтому раньше java выходила раз в 3-5 лет. Между версиями выходили апдейты – исправления ошибок и безопасности.
Долгие релизы замедляют развитие. В 2017 году производители JVM перешли на короткие циклы: теперь новая версия выходит раз в полгода. Новые фичи быстрее попадают к пользователям, и можно быстро получить обратную связь.
❓В чём проблема?
В больших проектах десятки микросервисов, сотни и тысячи серверов. Переводить инфраструктуру на новые версии каждые полгода — так себе задача. При этом важно получать обновления, чтобы не было пробелов в безопасности.
В таких случаях подойдёт java с пометкой LTS (Long Time Support). Последняя LTS— java 11. Следующая — java 17, выйдет в сентябре 2021 года.
❓Чем LTS версия отличается от обычной?
Каждая версия java— проект с отдельной кодовой базой.
Если в коде JVM найдена ошибка, то в идеале она исправляется во всех версиях, и апдейт уходит всем пользователям. Чем больше версий поддерживается, тем больше времени занимает исправление ошибки, тестирование и подготовка апдейта.
В случае пробелов с безопасностью время терять нельзя. Поэтому обновление готовится только для последней версии (java 14) и для LTS версии (java 11).
Таким образом, java LTS получает апдейты в течение нескольких лет, остальные версии — в течение полугода.
На продакшене должна быть безопасная версия с наименьшим количеством ошибок. Поэтому доступны три варианта:
🔸Обновлять инфраструктуру каждые полгода
🔸Оставаться на LTS и обновляться раз в 3 года
🔸Платить за поддержку другой версии
Выбор зависит от размеров проекта и сложности обновления.
Ответ на вопрос перед постом
В больших системах тяжело менять версию каждые полгода, но важно получать все обновления. Поэтому подходящий вариант — придерживаться последней LTS версии - java 11.
15 сентября выйдет новая java — версия под номером 15. В этом посте разберёмся, каковы шансы увидеть её на вашем продакшене.
Java — распространённый язык, и требования к каждому релизу высоки. Ожидается, что новая версия будет удобной и быстро работать на всех процессорах. Разработка и тестирование занимают время, поэтому раньше java выходила раз в 3-5 лет. Между версиями выходили апдейты – исправления ошибок и безопасности.
Долгие релизы замедляют развитие. В 2017 году производители JVM перешли на короткие циклы: теперь новая версия выходит раз в полгода. Новые фичи быстрее попадают к пользователям, и можно быстро получить обратную связь.
❓В чём проблема?
В больших проектах десятки микросервисов, сотни и тысячи серверов. Переводить инфраструктуру на новые версии каждые полгода — так себе задача. При этом важно получать обновления, чтобы не было пробелов в безопасности.
В таких случаях подойдёт java с пометкой LTS (Long Time Support). Последняя LTS— java 11. Следующая — java 17, выйдет в сентябре 2021 года.
❓Чем LTS версия отличается от обычной?
Каждая версия java— проект с отдельной кодовой базой.
Если в коде JVM найдена ошибка, то в идеале она исправляется во всех версиях, и апдейт уходит всем пользователям. Чем больше версий поддерживается, тем больше времени занимает исправление ошибки, тестирование и подготовка апдейта.
В случае пробелов с безопасностью время терять нельзя. Поэтому обновление готовится только для последней версии (java 14) и для LTS версии (java 11).
Таким образом, java LTS получает апдейты в течение нескольких лет, остальные версии — в течение полугода.
На продакшене должна быть безопасная версия с наименьшим количеством ошибок. Поэтому доступны три варианта:
🔸Обновлять инфраструктуру каждые полгода
🔸Оставаться на LTS и обновляться раз в 3 года
🔸Платить за поддержку другой версии
Выбор зависит от размеров проекта и сложности обновления.
Ответ на вопрос перед постом
В больших системах тяжело менять версию каждые полгода, но важно получать все обновления. Поэтому подходящий вариант — придерживаться последней LTS версии - java 11.
❤1
Релизный цикл в java, часть 2
С 2017 года java выходит раз в полгода. В прошлом посте обсудили релизы, а в этом обсудим жизненный цикл нововведений.
Фичи в java проходит две стадии:
1️⃣ Предварительная — по умолчанию не работает. Полностью готова, но открыта для обратной связи. Методы и реализация неокончательные.
2️⃣ Финальная — доступна по умолчанию.
Терминология в JDK посложнее, названия стадий зависят от типа фичи:
🔸Новый синтаксис, класс:
Preview / Standard
🔸JVM функционал:
Experimental / Production
🔸Утилиты, новое API:
Incubator / Standard
В списке фич новой версии «предварительный» статус указывают в скобках:
— Скоро java 15 выйдет, а в проекте 8 версия. Технологии идут вперёд, а я трачу лучшие годы на легаси((
У всех крупных проектов такая ситуация.
Ближайшая LTS версия java выйдет в сентябре 2021. Большинство фич, о которых пишут статьи, сейчас в превью стадии. Они не доступны по умолчанию и войдут в обиход большинства проектов не раньше конца 2021 года.
Но можно попробовать уже сейчас:
1️⃣ Intellij IDEA
File → Project Structure → Project → Project Language Level
В списке выбрать версию с пометкой (Preview)
2️⃣ Maven
В плагины, которые работают с кодом (maven-compiler-plugin, maven-surefire-plugin) добавить секцию
javac --release 13 --enable-preview
Обратная связь по превью фичам собирается в Java Bug Database.
С 2017 года java выходит раз в полгода. В прошлом посте обсудили релизы, а в этом обсудим жизненный цикл нововведений.
Фичи в java проходит две стадии:
1️⃣ Предварительная — по умолчанию не работает. Полностью готова, но открыта для обратной связи. Методы и реализация неокончательные.
2️⃣ Финальная — доступна по умолчанию.
Терминология в JDK посложнее, названия стадий зависят от типа фичи:
🔸Новый синтаксис, класс:
Preview / Standard
🔸JVM функционал:
Experimental / Production
🔸Утилиты, новое API:
Incubator / Standard
В списке фич новой версии «предварительный» статус указывают в скобках:
360: Sealed Classes (Preview)Чем ближе выход java, тем больше статей о новых фичах — records, text blocks, sealed classes и т. д. Многие разработчики грустят:
383: Foreign-Memory Access API (Second Incubator)
384: Records (Second Preview)
— Скоро java 15 выйдет, а в проекте 8 версия. Технологии идут вперёд, а я трачу лучшие годы на легаси((
У всех крупных проектов такая ситуация.
Ближайшая LTS версия java выйдет в сентябре 2021. Большинство фич, о которых пишут статьи, сейчас в превью стадии. Они не доступны по умолчанию и войдут в обиход большинства проектов не раньше конца 2021 года.
Но можно попробовать уже сейчас:
1️⃣ Intellij IDEA
File → Project Structure → Project → Project Language Level
В списке выбрать версию с пометкой (Preview)
2️⃣ Maven
В плагины, которые работают с кодом (maven-compiler-plugin, maven-surefire-plugin) добавить секцию
<configuration>3️⃣ При компиляции через консоль добавить 2 аргумента
<argLine>--enable-preview</argLine>
</configuration>
javac --release 13 --enable-preview
Обратная связь по превью фичам собирается в Java Bug Database.
❤1
Чем записи (records) отличаются от классов?
Anonymous Poll
62%
Нельзя поменять значения полей
15%
Нельзя использовать дженерики
61%
Не участвуют в наследовании
12%
Нет методов equals, hashcode
25%
Нет статических полей и методов
40%
Нет приватных полей
Records: обзор
Записи (records) появились как превью фича в java 14. В этом посте разберём, что такое записи, чем отличаются от классов и как их использовать.
Записи определяют неизменяемый набор значений:
🔸 Поля нельзя поменять: ни внутри методов, ни через рефлекшн
🔸 Нет приватных полей
🔸 Не участвуют в наследовании
🔸 Конструктор по умолчанию не пустой, а с заданными полями
🔸 Добавлены геттеры по умолчанию:
🔸 Для сериализации не нужен serialVersionUID
Запись - специальный класс для хранения данных.
✅ Определять методы
✅ Реализовать интерфейсы
✅ Добавлять static поля и методы
✅ Ставить аннотации
✅ Использовать дженерики
Ещё одна особенность records — конструктор. Конструктор по умолчанию содержит все поля и называется канонический конструктор:
1️⃣ В многопоточных алгоритмах
Неизменяемые значения не нужно синхронизировать.
2️⃣ Data Transfer Object (DTO)
Для отправки данных пользователю или в другую систему.
Для упрощения сложного кода и большей читаемости.
4️⃣ Как составное возвращаемое значение
Когда не хочется создавать отдельный класс ради одного метода:
В записях поля неизменны, также записи не участвуют в наследовании и не содержат приватных полей.
Записи (records) появились как превью фича в java 14. В этом посте разберём, что такое записи, чем отличаются от классов и как их использовать.
Записи определяют неизменяемый набор значений:
record Point(int x, int y) {}
Создаются так же, как и другие классы:Point p = new Point(1,2);В чём особенность?
🔸 Поля нельзя поменять: ни внутри методов, ни через рефлекшн
🔸 Нет приватных полей
🔸 Не участвуют в наследовании
🔸 Конструктор по умолчанию не пустой, а с заданными полями
🔸 Добавлены геттеры по умолчанию:
p.x()🔸 toString по умолчанию
p.y()
Point[x=1, y=2]🔸 equals и hashcode по умолчанию
🔸 Для сериализации не нужен serialVersionUID
Запись - специальный класс для хранения данных.
record Point компилируется в public final class Point extends java/lang/RecordВсе остальные функции класса сохраняются:
✅ Определять методы
✅ Реализовать интерфейсы
✅ Добавлять static поля и методы
✅ Ставить аннотации
✅ Использовать дженерики
Ещё одна особенность records — конструктор. Конструктор по умолчанию содержит все поля и называется канонический конструктор:
public Point(int x, int y){
this.x=x;
this.y=y;
}
Он доступен по умолчанию, его можно не писать. Переопределяйте конструктор, если нужно добавить проверку аргументов:public Point(int x, int y){
if (x>100) throw new …
this.x=x;
this.y=y;
}
Для канонического конструктора есть краткая запись. Можно опустить присвоение переменных и оставить только нужные проверки:public Point {
if (x>100) throw new ...
}
Другие конструкторы должны вызывать канонический:public Point(int x) {
this(x,0);
}
Где использовать записи:1️⃣ В многопоточных алгоритмах
Неизменяемые значения не нужно синхронизировать.
2️⃣ Data Transfer Object (DTO)
Для отправки данных пользователю или в другую систему.
record UserDTO(long id, String name) {
public UserDTO(User user) {…}
}
3️⃣ Как промежуточные значения в Stream APIДля упрощения сложного кода и большей читаемости.
4️⃣ Как составное возвращаемое значение
Когда не хочется создавать отдельный класс ради одного метода:
record MinMax<T>(T min, T max) {}
❗️Правильный ответ на вопрос перед постом: В записях поля неизменны, также записи не участвуют в наследовании и не содержат приватных полей.
👍3
Как будете отмечать выход java 15?
Anonymous Poll
25%
Вкусным обедом
31%
Интеллектуальной беседой
24%
Вечерней пиццей
13%
Встречей с друзьями
34%
Убойной тренировкой
Records и немного теории
15 сентября выйдет java 15. Если вы отмечаете это событие интеллектуальной беседой под пиццу, то этот пост для вас. Здесь вы найдёте немного computer science на тему records.
Неизменяемые типы — основа функциональных языков. Записи — простые структуры, но за этой простотой стоит теоретический фундамент.
Система типов — теория, на основе которой проектируется язык программирования. Cегодня разберём классификацию, которая отвечает на вопрос:
❓Как определить тип объекта?
1️⃣ По имени. Тогда это номинальный тип
На основе имени проверяется возможность вызова методов и приведения типов друг к другу
2️⃣ По данным внутри объекта. Тогда это структурный тип.
Для них возможна запись:
✅
В java структурных типов нет и скорее всего не будет. В 2013 году обсуждалось, чтобы ввести в язык первый структурный тип под названием arrow type. Выглядел бы он так:
15 сентября выйдет java 15. Если вы отмечаете это событие интеллектуальной беседой под пиццу, то этот пост для вас. Здесь вы найдёте немного computer science на тему records.
Неизменяемые типы — основа функциональных языков. Записи — простые структуры, но за этой простотой стоит теоретический фундамент.
Система типов — теория, на основе которой проектируется язык программирования. Cегодня разберём классификацию, которая отвечает на вопрос:
❓Как определить тип объекта?
1️⃣ По имени. Тогда это номинальный тип
На основе имени проверяется возможность вызова методов и приведения типов друг к другу
record Point(int x,int y){}
record Time(int hours,int min){}
❌ Point p = new Time(1,1);
Записи по факту одинаковые — два целых числа. Но имена разные, поэтому типы между собой несовместимы. У номинальных типов проверки часто происходят на этапе компиляции.2️⃣ По данным внутри объекта. Тогда это структурный тип.
Для них возможна запись:
✅
Point p = new Time(1,1);
Структурные типы используются в функциональных языках и java script. Они добавляют больше гибкости, но менее управляемы.В java структурных типов нет и скорее всего не будет. В 2013 году обсуждалось, чтобы ввести в язык первый структурный тип под названием arrow type. Выглядел бы он так:
(String) → IntegerИдею отвергли из-за сложностей реализации и адаптации к существующим библиотекам. Альтернативное решение — лямбда-выражения, представляют похожую функциональность, но с чётко определённым типом:
Function<String,Integer> f =Все структуры в java номинальные. Записи - не исключение. Номинальность была в требованиях для реализации, а в анонсе records называют nominal tuples — номинальные кортежи.
str → str.length();
👍3
Java выходит каждые полгода, сегодня релиз 15 версии. Если Age - ваш возраст в 2020, через сколько лет версия java будет равна вашему возрасту?
Anonymous Poll
24%
Age - 15
39%
(Age - 15) / 2
17%
(Age - 15) * 2
20%
Age - 15 + Age / 2
Java 15: анонс
Сегодня вышла 15 версия языка, которому посвящён этот канал❤️
В релизе 14 обновлений:
1️⃣ Новый синтаксис — пока в превью фазе:
▫️Текстовые блоки
▫️Sealed classes
▫️Записи
▫️Удобный instanceof:
2️⃣ Новое API:
▪️Алгоритм цифровой подписи EdDSA появился в пакете security.
▪️Foreign-Memory Access API: доступ к памяти за пределами Heap.
▪️Скрытые классы:
Большинство фреймворков работают так: помечаете классы аннотациями, фреймворк их находит и создаёт класс-обёртку с дополнительными функциями.
3️⃣ Обновились классы DatagramSocket и MulticastSocket.
4️⃣ В финальную стадию вошли 2 сборщика мусора: ZGC и Shenandoah.
Оба сборщика подойдут для приложений с RAM до 4 ТБ, в которых нежелательны долгие паузы на сборку мусора. В новых GC задержка не превысит 2 мс, но среднее время работы чуть увеличится.
5️⃣ Некоторые фичи стали недоступны:
Nashorn JS Engine, Biased Locking, Solaris and SPARC Ports, RMI Activation for Removal
Ответ на вопрос перед постом
Как посчитать, когда версия java будет равна вашему возрасту:
Пусть Age – возраст в 2020
x – количество лет, через которое версия = возраст.
Сегодня вышла 15 версия языка, которому посвящён этот канал❤️
В релизе 14 обновлений:
1️⃣ Новый синтаксис — пока в превью фазе:
▫️Текстовые блоки
▫️Sealed classes
▫️Записи
▫️Удобный instanceof:
if (obj instanceof String str)можно сразу использовать str как переменную.
2️⃣ Новое API:
▪️Алгоритм цифровой подписи EdDSA появился в пакете security.
▪️Foreign-Memory Access API: доступ к памяти за пределами Heap.
▪️Скрытые классы:
Большинство фреймворков работают так: помечаете классы аннотациями, фреймворк их находит и создаёт класс-обёртку с дополнительными функциями.
MethodHandles.lookup()Создаст класс, который недоступен коду основного приложения.
.defineHiddenClass(…)
3️⃣ Обновились классы DatagramSocket и MulticastSocket.
4️⃣ В финальную стадию вошли 2 сборщика мусора: ZGC и Shenandoah.
Оба сборщика подойдут для приложений с RAM до 4 ТБ, в которых нежелательны долгие паузы на сборку мусора. В новых GC задержка не превысит 2 мс, но среднее время работы чуть увеличится.
5️⃣ Некоторые фичи стали недоступны:
Nashorn JS Engine, Biased Locking, Solaris and SPARC Ports, RMI Activation for Removal
Ответ на вопрос перед постом
Как посчитать, когда версия java будет равна вашему возрасту:
Пусть Age – возраст в 2020
x – количество лет, через которое версия = возраст.
Age + x = 15 + 2*x
x = Age - 15Как вы попали на собеседование на текущее место работы?
Anonymous Poll
27%
Откликнулся на HeadHunter
11%
Откликнулся на сайте компании
30%
Пришёл по рекомендации
33%
HR меня нашёл и позвал на собеседование
👍2
Хочешь хорошую работу? Закрой HH
Популярный способ найти работу — открыть HeadHunter и откликнуться на подходящие вакансии. Способ простой, но поиск растянется на недели и маловероятно, что вы найдёте вакансию мечты.
Почему так происходит? HR Арина написала прекрасный лонгрид на эту тему: Найти работу и не впасть в отчаяние.
Краткий пересказ:
На вакансию средних и крупных компанию откликается 100-1000 человек. Даже если вы идеально подходите на должность, резюме могут:
🔸Пропустить
🔸Невнимательно посмотреть
🔸Отбросить за малейший недочёт
Попробуйте другие стратегии — целевой поиск и рекомендации.
1️⃣ Целевой поиск
Cоставить список интересных компаний и общаться с ними напрямую. В составлении списка поможет HH.
Зайдите на сайт каждой компании в списке, найдите вкладку Jobs/Careers и отправьте резюме и сопроводительное письмо.
Зафиксируйте в списке контакты, открытые позиции, вопросы с собеседований, обратную связь работодателей.
✅ Рекрутёр оценит вашу инициативность.
✅ Отклик попадает на почту рекрутёру или во внутреннюю систему компании. Шанс, что письмо прочитают, в разы выше, чем на HH.
2️⃣ Рекомендации
Напишите бывшим коллегам и начальникам: спросите о текущих проектах в компании. Расскажите, что ищете работу и попросите порекомендовать вас.
✅ Заранее узнаете информацию о проектах и требованиях.
✅ Собеседование скорее всего будет проще.
Мои дополнения:
🔹В IT за рекомендацию кандидатов часто выдают бонусы, поэтому бывшие коллеги вам с радостью помогут.
🔹Для джуниор-мидл разработчиков целевой поиск обязателен. Если вам нравится компания, но на сайте нет подходящей по уровню вакансии, то попробуйте следующий способ:
На контакт из вкладки Careers отправьте резюме и примерно такое мотивационное письмо:
Здравствуйте, меня зовут ...
Я давно слежу за компанией Х, и мне очень нравится направление её работы. Ваша платформа помогает сотням интернет-магазинов с бухгалтерией, вы делаете ценный вклад в развитие малого бизнеса.
Подскажите, пожалуйста, как можно присоединиться к вашей команде?
Я — начинающий java разработчик. Моё резюме - в приложении к письму.
С уважением, ...
Вы не навязываетесь, всего лишь просите совет. Такие формулировки встречаются редко и увеличивают шанс получить обратную связь или приглашение на собеседование😌
Популярный способ найти работу — открыть HeadHunter и откликнуться на подходящие вакансии. Способ простой, но поиск растянется на недели и маловероятно, что вы найдёте вакансию мечты.
Почему так происходит? HR Арина написала прекрасный лонгрид на эту тему: Найти работу и не впасть в отчаяние.
Краткий пересказ:
На вакансию средних и крупных компанию откликается 100-1000 человек. Даже если вы идеально подходите на должность, резюме могут:
🔸Пропустить
🔸Невнимательно посмотреть
🔸Отбросить за малейший недочёт
Попробуйте другие стратегии — целевой поиск и рекомендации.
1️⃣ Целевой поиск
Cоставить список интересных компаний и общаться с ними напрямую. В составлении списка поможет HH.
Зайдите на сайт каждой компании в списке, найдите вкладку Jobs/Careers и отправьте резюме и сопроводительное письмо.
Зафиксируйте в списке контакты, открытые позиции, вопросы с собеседований, обратную связь работодателей.
✅ Рекрутёр оценит вашу инициативность.
✅ Отклик попадает на почту рекрутёру или во внутреннюю систему компании. Шанс, что письмо прочитают, в разы выше, чем на HH.
2️⃣ Рекомендации
Напишите бывшим коллегам и начальникам: спросите о текущих проектах в компании. Расскажите, что ищете работу и попросите порекомендовать вас.
✅ Заранее узнаете информацию о проектах и требованиях.
✅ Собеседование скорее всего будет проще.
Мои дополнения:
🔹В IT за рекомендацию кандидатов часто выдают бонусы, поэтому бывшие коллеги вам с радостью помогут.
🔹Для джуниор-мидл разработчиков целевой поиск обязателен. Если вам нравится компания, но на сайте нет подходящей по уровню вакансии, то попробуйте следующий способ:
На контакт из вкладки Careers отправьте резюме и примерно такое мотивационное письмо:
Здравствуйте, меня зовут ...
Я давно слежу за компанией Х, и мне очень нравится направление её работы. Ваша платформа помогает сотням интернет-магазинов с бухгалтерией, вы делаете ценный вклад в развитие малого бизнеса.
Подскажите, пожалуйста, как можно присоединиться к вашей команде?
Я — начинающий java разработчик. Моё резюме - в приложении к письму.
С уважением, ...
Вы не навязываетесь, всего лишь просите совет. Такие формулировки встречаются редко и увеличивают шанс получить обратную связь или приглашение на собеседование😌
👍3❤1
🍃Spring: статистика использования
Есть ли в java мире более популярный фреймворк, чем Spring?
Кажется, что нет. Spring упоминается в половине вакансий на HeadHunter и используется в большинстве веб-сервиcов на java.
Spring— огромная экосистема из 24 проектов. Все освоить невозможно, да и не нужно. Лучше сфокусироваться на самых актуальных. Компания VMWare занимается виртуализацией и недавно провела опрос более тысячи разработчиков: как и с чем они используют Spring. Результаты опроса собрались в доклад State of Spring 2020:
Какие модули Spring используются чаще всего?
▫️>75% - MVC, Security, Data
▫️56% - Cloud
▫️30-40% - Batch, Integration, Kafka
Spring Boot на пике популярности:
🔸82% разработчиков пишут на нём новые проекты
🔸53% планируют перевести на Spring Boot легаси проекты
Что нравится в Spring Boot:
🔹70% - Готовые конфигурации
🔹64% - Стабильность, безопасность, масштабируемость
🔹61% - Удобство разработки
Что вызывает вопросы:
▪️39% - Непонятно, как это работает😅
▪️34% - Долгий запуск приложений
▪️25% - Высокое потребление памяти
*В апреле у Spring появилась поддержка GraalVM. С ним время запуска и расход памяти будут ниже.
Какая архитектура встречается в приложениях Spring Boot?
▫️83% - Микросервисы
▫️33% - Реактивная (Project Reactor, Webflux)
▫️12% - Serverless (Spring Cloud Function)
Где Spring Boot, там и Docker:
🔸65% уже запускают приложения в контейнерах
🔸30% планируют начать в этом году
Где Docker, там и Kubernetes:
▪️44% уже используют Kubernetes для развёртывания
▪️31% планируют перейти в течение 12 месяцев
Люблю такие опросы: видно, куда движется разработка бэкенда. Начинающим разработчикам полезно вдвойне - понятно, что и в каком порядке изучать.
#статистика
Есть ли в java мире более популярный фреймворк, чем Spring?
Кажется, что нет. Spring упоминается в половине вакансий на HeadHunter и используется в большинстве веб-сервиcов на java.
Spring— огромная экосистема из 24 проектов. Все освоить невозможно, да и не нужно. Лучше сфокусироваться на самых актуальных. Компания VMWare занимается виртуализацией и недавно провела опрос более тысячи разработчиков: как и с чем они используют Spring. Результаты опроса собрались в доклад State of Spring 2020:
Какие модули Spring используются чаще всего?
▫️>75% - MVC, Security, Data
▫️56% - Cloud
▫️30-40% - Batch, Integration, Kafka
Spring Boot на пике популярности:
🔸82% разработчиков пишут на нём новые проекты
🔸53% планируют перевести на Spring Boot легаси проекты
Что нравится в Spring Boot:
🔹70% - Готовые конфигурации
🔹64% - Стабильность, безопасность, масштабируемость
🔹61% - Удобство разработки
Что вызывает вопросы:
▪️39% - Непонятно, как это работает😅
▪️34% - Долгий запуск приложений
▪️25% - Высокое потребление памяти
*В апреле у Spring появилась поддержка GraalVM. С ним время запуска и расход памяти будут ниже.
Какая архитектура встречается в приложениях Spring Boot?
▫️83% - Микросервисы
▫️33% - Реактивная (Project Reactor, Webflux)
▫️12% - Serverless (Spring Cloud Function)
Где Spring Boot, там и Docker:
🔸65% уже запускают приложения в контейнерах
🔸30% планируют начать в этом году
Где Docker, там и Kubernetes:
▪️44% уже используют Kubernetes для развёртывания
▪️31% планируют перейти в течение 12 месяцев
Люблю такие опросы: видно, куда движется разработка бэкенда. Начинающим разработчикам полезно вдвойне - понятно, что и в каком порядке изучать.
#статистика
👍5
В java 15 в продакшн стадию вошли 2 новых сборщика мусора — Shenandoah и ZGC. Возникает логичный вопрос — зачем они нужны? В java 8 и так 4 сборщика, что с ними не так?
Кратко ответить не получилось, поэтому на этой неделе выйдет роман в трёх частях:
🔸Часть 1: обзор и принцип работы
🔸Часть 2: Serial, Parallel, CMS, G1
🔸Часть 3: Shenandoah, ZGC, Epsilon
Кратко ответить не получилось, поэтому на этой неделе выйдет роман в трёх частях:
🔸Часть 1: обзор и принцип работы
🔸Часть 2: Serial, Parallel, CMS, G1
🔸Часть 3: Shenandoah, ZGC, Epsilon
Сборщики мусора: часть 1. Обзор
Сборка мусора — фоновый процесс в JVM, который удаляет уже ненужные объекты. В основном каждая реализация балансирует между двумя параметрами:
🔹Latency: максимальное время обработки запроса
🔹Пропускная способность: сколько запросов обработается в минуту
"Запрос" здесь - взаимодействие приложения с памятью: создание, обновление и удаление объектов.
Приоритет зависит от приложения:
▪️Для веб-сервисов большие задержки недопустимы. Лучше в среднем ответ будет на четверть секунды дольше, но не будет подвисших запросов.
▪️Приложение работает в фоновом режиме. Например, архивирует записи. Не критично, если каждая сотая запись будет архивироваться 5 секунд, если за час обработается больше данных.
Алгоритм коллектора везде один и тот же:
🔸Отмечаем объекты, которые нужны
🔸Помечаем остальные объекты на удаление
🔸Удаляем ненужные объекты
🔸Группируем выжившие
Чтобы понять, какие объекты нужны приложению, строится граф достижимых объектов. Самостоятельные объекты называются roots и существуют без привязки к другим. Это локальные и статические переменные, потоки и т.д.
Смотрим, на какие объекты ссылаются roots. Идём дальше по ссылкам и получаем граф живых объектов.
⚠️Но есть проблема: объекты в памяти постоянно меняются. Есть две крайности:
1️⃣ Когда памяти останется мало, целиком остановить приложение и убрать мусор. Будет большая пауза, но в остальное время сборщик не будет тормозить основное приложение.
2️⃣ Следить за статусом объектов и ссылок, вести таблицы использования. Так ненужные объекты легко найти, но сам сборщик будет занимать много процессорного времени.
Разные коллекторы балансируют между этими крайностями: некоторые фазы происходят параллельно, а для некоторых нужна полная остановка.
Универсального сборщика нет, на выбор влияет количество процессоров, памяти, тип нагрузки и так далее.
В части 2 мы подробно рассмотрим сборщики мусора в java 8
#jvm
Сборка мусора — фоновый процесс в JVM, который удаляет уже ненужные объекты. В основном каждая реализация балансирует между двумя параметрами:
🔹Latency: максимальное время обработки запроса
🔹Пропускная способность: сколько запросов обработается в минуту
"Запрос" здесь - взаимодействие приложения с памятью: создание, обновление и удаление объектов.
Приоритет зависит от приложения:
▪️Для веб-сервисов большие задержки недопустимы. Лучше в среднем ответ будет на четверть секунды дольше, но не будет подвисших запросов.
▪️Приложение работает в фоновом режиме. Например, архивирует записи. Не критично, если каждая сотая запись будет архивироваться 5 секунд, если за час обработается больше данных.
Алгоритм коллектора везде один и тот же:
🔸Отмечаем объекты, которые нужны
🔸Помечаем остальные объекты на удаление
🔸Удаляем ненужные объекты
🔸Группируем выжившие
Чтобы понять, какие объекты нужны приложению, строится граф достижимых объектов. Самостоятельные объекты называются roots и существуют без привязки к другим. Это локальные и статические переменные, потоки и т.д.
Смотрим, на какие объекты ссылаются roots. Идём дальше по ссылкам и получаем граф живых объектов.
⚠️Но есть проблема: объекты в памяти постоянно меняются. Есть две крайности:
1️⃣ Когда памяти останется мало, целиком остановить приложение и убрать мусор. Будет большая пауза, но в остальное время сборщик не будет тормозить основное приложение.
2️⃣ Следить за статусом объектов и ссылок, вести таблицы использования. Так ненужные объекты легко найти, но сам сборщик будет занимать много процессорного времени.
Разные коллекторы балансируют между этими крайностями: некоторые фазы происходят параллельно, а для некоторых нужна полная остановка.
Универсального сборщика нет, на выбор влияет количество процессоров, памяти, тип нагрузки и так далее.
В части 2 мы подробно рассмотрим сборщики мусора в java 8
#jvm
👍3❤1
Сборщики мусора, часть 2. Java 8
В команде java 8 четыре участника: Serial GC, Parallel GC, CMS, G1.
Прежде, чем разобрать разницу между ними, повторим теорию. Базовый алгоритм сборки мусора такой:
🔸Построить граф живых объектов
🔸Пометить те, что остались, на удаление
🔸Удалить ненужные объекты
🔸Сгруппировать выжившие
*Сборщики в java 8 пропускают последнюю фазу
Обходить каждый раз всю память - долго и нерационально. Выгоднее всего убирать локальные переменные и промежуточные объекты. Это суть гипотезы поколений:
Память делится на регионы. Новые объекты помещаются в область «новое поколение». Там сборщик будет работать чаще всего. Объекты, которые пережили несколько сборок, считаются «старыми» и переносятся в другую область памяти. Их проверяют реже.
Сборка может быть трёх типов:
▫️Minor - обойти только молодое поколение
▫️Major - только старое
▫️Full - память целиком
Перейдём к практике. Я опустила 90% деталей, чтобы наглядно показать разницу между коллекторами.
Serial GC
При любом типе сборки коллектор останавливает потоки основного приложения. Один поток коллектора выполняет все этапы.
✅ Минимум действий при работе приложения
❌ Долгие паузы
Когда ок: память до 100 МБ, одно ядро, остановки не критичны
Parallel GC
Тоже останавливает работу приложения, но запускает несколько потоков для сборки мусора. Сборщик по умолчанию в java 8.
✅ Работает почти незаметно — не более 1% процессорного времени
❌ Чем больше памяти — тем дольше паузы.
CMS - Concurrent Mark Sweep
Старое и новое поколение обрабатывается по-разному.
▫️Чистка нового поколения как в Parallel GC: основное приложение останавливается, и запускаются несколько потоков коллектора.
▫️Старшее поколение собирается по-другому:
Большая часть графа объектов строится параллельно с основным приложением. Объекты удаляются тоже параллельно. Поэтому сборщик и называется Concurrent Mark Sweep - параллельная разметка и удаление.
⛔️ Помечен Deprecated в Java 9, потому что по всем фронтам уступает G1
G1 - Garbage First
Предыдущие сборщики делили память на 3-4 большие области — одно для старого поколения и 2-3 для нового. Суть G1 — деление памяти на 2048 регионов, которым присваивается тип - свободный, young, survivor или old.
Что это даёт:
▪️Сборщик обрабатывает только несколько регионов, а не всё поколение за раз.
▪️Можно менять количество регионов и регулировать время паузы.
▪️Приложения с большой памятью не тормозят, тк память обрабатывается по частям.
▪️Если регион однородный, можно сразу поменять его тип. Был молодой — стал свободный. Был молодой — стал выживший.
▪️Каждый регион мониторится отдельно. Так G1 выбирает перспективные регионы, куда недавно добавилось много объектов. Отсюда и название - Garbage First.
В остальном G1 похож на предыдущие сборщики:
🔹Уборка в молодом поколении останавливает потоки приложения.
🔹Общая проходит как у CMS — некоторые фазы тормозят работу приложения, некоторые работают параллельно
✅ Есть настройка длины паузы и других параметров. Гайд по тюнингу G1
✅ Работает с большой памятью
✅ Анализирует статистику сборок, хорошо работает с настройками по умолчанию.
❌ Занимает до 10% процессорного времени
G1 показывает отличные результаты в энтерпрайзе. В java 9 стал сборщиком мусора по умолчанию.
В следующей части посмотрим на новые сборщики — Shenandoah, ZGC и Epsilon GC.
#jvm
В команде java 8 четыре участника: Serial GC, Parallel GC, CMS, G1.
Прежде, чем разобрать разницу между ними, повторим теорию. Базовый алгоритм сборки мусора такой:
🔸Построить граф живых объектов
🔸Пометить те, что остались, на удаление
🔸Удалить ненужные объекты
🔸Сгруппировать выжившие
*Сборщики в java 8 пропускают последнюю фазу
Обходить каждый раз всю память - долго и нерационально. Выгоднее всего убирать локальные переменные и промежуточные объекты. Это суть гипотезы поколений:
Память делится на регионы. Новые объекты помещаются в область «новое поколение». Там сборщик будет работать чаще всего. Объекты, которые пережили несколько сборок, считаются «старыми» и переносятся в другую область памяти. Их проверяют реже.
Сборка может быть трёх типов:
▫️Minor - обойти только молодое поколение
▫️Major - только старое
▫️Full - память целиком
Перейдём к практике. Я опустила 90% деталей, чтобы наглядно показать разницу между коллекторами.
Serial GC
При любом типе сборки коллектор останавливает потоки основного приложения. Один поток коллектора выполняет все этапы.
✅ Минимум действий при работе приложения
❌ Долгие паузы
Когда ок: память до 100 МБ, одно ядро, остановки не критичны
Parallel GC
Тоже останавливает работу приложения, но запускает несколько потоков для сборки мусора. Сборщик по умолчанию в java 8.
✅ Работает почти незаметно — не более 1% процессорного времени
❌ Чем больше памяти — тем дольше паузы.
CMS - Concurrent Mark Sweep
Старое и новое поколение обрабатывается по-разному.
▫️Чистка нового поколения как в Parallel GC: основное приложение останавливается, и запускаются несколько потоков коллектора.
▫️Старшее поколение собирается по-другому:
Большая часть графа объектов строится параллельно с основным приложением. Объекты удаляются тоже параллельно. Поэтому сборщик и называется Concurrent Mark Sweep - параллельная разметка и удаление.
⛔️ Помечен Deprecated в Java 9, потому что по всем фронтам уступает G1
G1 - Garbage First
Предыдущие сборщики делили память на 3-4 большие области — одно для старого поколения и 2-3 для нового. Суть G1 — деление памяти на 2048 регионов, которым присваивается тип - свободный, young, survivor или old.
Что это даёт:
▪️Сборщик обрабатывает только несколько регионов, а не всё поколение за раз.
▪️Можно менять количество регионов и регулировать время паузы.
▪️Приложения с большой памятью не тормозят, тк память обрабатывается по частям.
▪️Если регион однородный, можно сразу поменять его тип. Был молодой — стал свободный. Был молодой — стал выживший.
▪️Каждый регион мониторится отдельно. Так G1 выбирает перспективные регионы, куда недавно добавилось много объектов. Отсюда и название - Garbage First.
В остальном G1 похож на предыдущие сборщики:
🔹Уборка в молодом поколении останавливает потоки приложения.
🔹Общая проходит как у CMS — некоторые фазы тормозят работу приложения, некоторые работают параллельно
✅ Есть настройка длины паузы и других параметров. Гайд по тюнингу G1
✅ Работает с большой памятью
✅ Анализирует статистику сборок, хорошо работает с настройками по умолчанию.
❌ Занимает до 10% процессорного времени
G1 показывает отличные результаты в энтерпрайзе. В java 9 стал сборщиком мусора по умолчанию.
В следующей части посмотрим на новые сборщики — Shenandoah, ZGC и Epsilon GC.
#jvm
❤1
Сборщики мусора, часть 3. Java 15
В java 15 в продакшн стадию вошли 2 новых сборщика мусора — Shenandoah и ZGC.
Они подойдут для приложений с памятью до 4 ТБ, где нежелательны длинные задержки. Среднее время паузы не превышает 1 миллисекунду. За такие короткие паузы придётся платить накладными расходами — сборщики занимают до 15% процессорного времени.
❓Как они работают и как получаются такие результаты?
Как и в прошлой статье, пропустим 90% деталей и посмотрим на главное. У новых коллекторов 2 особенности:
1️⃣ Расширенные ссылки
Обычно в ссылках на объект находится только адрес памяти, где этот объект лежит. Размер поля под ссылку — 64 бита, поэтому в теории можно хранить адрес в пределах 128 ТБ.
Это много, поэтому диапазон адресов сокращён до 4 ТБ, а в свободные биты коллектор записывает нужную для себя информацию. Ссылки читаются и обновляются атомарно. Сборщику нужно меньше доп.структур и синхронизации и можно работать почти параллельно с основным приложением.
2️⃣ Load barriers
При загрузке объекта сначала читается дополнительная информация из ссылки. Поток приложения или коллектора что-нибудь делает и только потом возвращает адрес в памяти.
Что еще. Оба сборщика:
✅ Не используют поколения, работают со всеми объектами
✅ Делят память на множество регионов
✅ Группируют объекты. Дефрагментация помогает быстрее работать с памятью
Теперь о разнице между Shenandoah и ZGC:
Главное отличие в том, что конкретно записывается в ссылку, и как коллектор с этой информацией работает:
🔹Указатели в Shenandoah используют концепт brook pointers. В ссылке записан адрес объекта и, если объект был перемещён, новый адрес.
Допустим, есть объект Х, ссылки на который есть у десятка других объектов. При перемещении Х ссылки станут недействительны и должны быть обновлены. Но поскольку в brook pointers помещается два адреса, старые ссылки можно сразу не трогать. При чтении объекта поток увидит, что есть новая ссылка и сам перезапишет её.
🔹В ZGC у ссылок другой формат – colored pointers. В них коллектор записывает служебную информацию: был ли уже посещён объект, нужно ли его удалить или переместить, есть ли у него финалайзер и т.д
Ещё одно отличие — поддержка в JDK. Она зависит от производителя JDK, версии java и ОС.
🔸Shenandoah разрабатывает компания Red Hat. Сборщик доступен в OpenJDK для java 15, сделана поддержка для java 8(!!!) и 11. Oracle отказалась поддерживать Shenandoah, поэтому в OracleJDK его нет.
🔸Разработку ZGC ведёт Oracle. Коллектор включен везде: и в OracleJDK и OpenJDK. В 11 версии есть поддержка Linux, в 14 — Windows.
Epsilon GC
С java 11 доступен ещё один экспериментальный сборщик —Epsilon GC. С ним приложение работает максимально быстро, потому что сборки мусора как таковой нет. Заканчивается память — JVM завершает работу.
Где пригодится:
✅ Короткие разовые задачи
Быстро сделал — быстро завершился
✅ Тестирование и эксперименты
Без фоновой работы коллектора легче оценить производительность и занимаемую память.
#jvm
В java 15 в продакшн стадию вошли 2 новых сборщика мусора — Shenandoah и ZGC.
Они подойдут для приложений с памятью до 4 ТБ, где нежелательны длинные задержки. Среднее время паузы не превышает 1 миллисекунду. За такие короткие паузы придётся платить накладными расходами — сборщики занимают до 15% процессорного времени.
❓Как они работают и как получаются такие результаты?
Как и в прошлой статье, пропустим 90% деталей и посмотрим на главное. У новых коллекторов 2 особенности:
1️⃣ Расширенные ссылки
Обычно в ссылках на объект находится только адрес памяти, где этот объект лежит. Размер поля под ссылку — 64 бита, поэтому в теории можно хранить адрес в пределах 128 ТБ.
Это много, поэтому диапазон адресов сокращён до 4 ТБ, а в свободные биты коллектор записывает нужную для себя информацию. Ссылки читаются и обновляются атомарно. Сборщику нужно меньше доп.структур и синхронизации и можно работать почти параллельно с основным приложением.
2️⃣ Load barriers
При загрузке объекта сначала читается дополнительная информация из ссылки. Поток приложения или коллектора что-нибудь делает и только потом возвращает адрес в памяти.
Что еще. Оба сборщика:
✅ Не используют поколения, работают со всеми объектами
✅ Делят память на множество регионов
✅ Группируют объекты. Дефрагментация помогает быстрее работать с памятью
Теперь о разнице между Shenandoah и ZGC:
Главное отличие в том, что конкретно записывается в ссылку, и как коллектор с этой информацией работает:
🔹Указатели в Shenandoah используют концепт brook pointers. В ссылке записан адрес объекта и, если объект был перемещён, новый адрес.
Допустим, есть объект Х, ссылки на который есть у десятка других объектов. При перемещении Х ссылки станут недействительны и должны быть обновлены. Но поскольку в brook pointers помещается два адреса, старые ссылки можно сразу не трогать. При чтении объекта поток увидит, что есть новая ссылка и сам перезапишет её.
🔹В ZGC у ссылок другой формат – colored pointers. В них коллектор записывает служебную информацию: был ли уже посещён объект, нужно ли его удалить или переместить, есть ли у него финалайзер и т.д
Ещё одно отличие — поддержка в JDK. Она зависит от производителя JDK, версии java и ОС.
🔸Shenandoah разрабатывает компания Red Hat. Сборщик доступен в OpenJDK для java 15, сделана поддержка для java 8(!!!) и 11. Oracle отказалась поддерживать Shenandoah, поэтому в OracleJDK его нет.
🔸Разработку ZGC ведёт Oracle. Коллектор включен везде: и в OracleJDK и OpenJDK. В 11 версии есть поддержка Linux, в 14 — Windows.
Epsilon GC
С java 11 доступен ещё один экспериментальный сборщик —Epsilon GC. С ним приложение работает максимально быстро, потому что сборки мусора как таковой нет. Заканчивается память — JVM завершает работу.
Где пригодится:
✅ Короткие разовые задачи
Быстро сделал — быстро завершился
✅ Тестирование и эксперименты
Без фоновой работы коллектора легче оценить производительность и занимаемую память.
#jvm
❤1
Спасибо всем за обратную связь и лайки❤️ Поняла, что зря волновалась
По поводу применимости - сборщики действительно нужны больше для общего понимания работы JVM. Возможно, вам никогда не придётся выбирать коллектор и тюнить его.
Но! Shenandoah совместим с java 8, и многие проекты сейчас с ним экспериментируют. Вот 2 статьи (первая, вторая) с бенчмарками - при включении Shenandoah в кластерах Cassandra задержки снизились на 25-80%. Кто знает, может новые коллекторы пригодятся и на вашем проекте
По поводу применимости - сборщики действительно нужны больше для общего понимания работы JVM. Возможно, вам никогда не придётся выбирать коллектор и тюнить его.
Но! Shenandoah совместим с java 8, и многие проекты сейчас с ним экспериментируют. Вот 2 статьи (первая, вторая) с бенчмарками - при включении Shenandoah в кластерах Cassandra задержки снизились на 25-80%. Кто знает, может новые коллекторы пригодятся и на вашем проекте
❤1
Новые методы интерфейса List
Сегодня разберём вопрос с собеседований по новым методам интерфейса List. Подробно рассмотрим каждый вариант ответа, потому что методы не экзотичные и пригодятся в ежедневной работе.
В посте много кода, поэтому для удобства чтения он тут: https://teletype.in/@java_fillthegaps/QN39vs6K0
В конце небольшое лирическое отступление на тему трендов и дизайна методов.
#собеседование
Сегодня разберём вопрос с собеседований по новым методам интерфейса List. Подробно рассмотрим каждый вариант ответа, потому что методы не экзотичные и пригодятся в ежедневной работе.
В посте много кода, поэтому для удобства чтения он тут: https://teletype.in/@java_fillthegaps/QN39vs6K0
В конце небольшое лирическое отступление на тему трендов и дизайна методов.
#собеседование
❤1