Ну что, как вам реклама в Телеграме? Спасибо хоть, что не казино Три Топора 🤣
Как подросла производительность сборщиков мусора с JDK 8 по JDK 17. Увеличилась пропускная способность, уменьшились паузы и уменьшилось потребление памяти (кроме ZGC). Поэтому, если вы тупо перейдёте на Java 17, даже без перекомпиляции, то автоматом всё станет быстрее.
Ссылка.
Ссылка.
В Java 18 появился коммит, который убирает неявную ссылку из анонимного класса в соответствующий внешний класс, если внутренний класс его не использует. Это то, из-за чего раньше настоятельно рекомендовалось использовать лямбды вместо анонимных классов, потому что в лямбдах как раз эти ненужные ссылки не добавляются и объекты внешних классов очищаются вовремя. Теперь же анонимные классы и лямбды будут вести себя одинаково в этом плане. Правда пишут, что это изменение сломало некие тесты в JCK, но это пообещали исследовать и возможно коммит откатывать не придётся.
#java18
#java18
Что вы используете в продакшене? (для тех, кто всё ещё на Java 8, проголосуйте за 4-й вариант)
Final Results
48%
Готовый JDK
18%
Готовый JRE
1%
Собираем свой образ через jlink с нужными модулями
33%
Мы всё ещё на Java 8 (или старее)
YouTube-канал Java преодолел планку в 100 тысяч подписчиков. А вы подписаны?
microJUG
В Java 18 появился коммит, который убирает неявную ссылку из анонимного класса в соответствующий внешний класс, если внутренний класс его не использует. Это то, из-за чего раньше настоятельно рекомендовалось использовать лямбды вместо анонимных классов, потому…
Выбрасывание неявной ссылки на внешний класс уже попало в последнюю сборку JDK 18-ea+26. Откатывать, слава богу, ничего не будут. Я проверил, this$0 действительно исчезает, если анонимный класс не использует ссылку. Но есть один нюанс: если класс является Serializable и нету поля serialVersionUID, то ссылка остаётся :(. Например, в таком анонимном классе this$0 будет всё равно присутствовать:
Так что новая оптимизация вылечит далеко не все случаи. А любителям double brace initialization придётся писать вот так, чтобы избежать ссылки:
new ArrayList<>() {
...
}
Сериализуемых классов в JDK весьма много. Например, практически все коллекции.Так что новая оптимизация вылечит далеко не все случаи. А любителям double brace initialization придётся писать вот так, чтобы избежать ссылки:
var list = new ArrayList<>() {public static final long serialVersionUID = 1L;{
add(1); }};
#java18👍1
"Java не столь популярна у современных разработчиков"
Всё, пацаны, расходимся 🤷♂️
https://zona.media/news/2021/12/11/log4fun
Всё, пацаны, расходимся 🤷♂️
https://zona.media/news/2021/12/11/log4fun
Медиазона
Уязвимость в распространенной библиотеке Log4j для Java поставила под угрозу безопасность крупнейших сервисов и приложений
Уязвимость в широко используемой библиотеке логирования Apache Log4j для программной платформы Java поставила под угроз...
👍1🔥1
Ну что, тестируем реакции в Телеге. Го в комменты 👇
А ещё тестимспойлеры
А ещё тестим
👍25🔥5😱4🎉3🤮3
Программист провёл интересный эксперимент: он реализовал простой сетевой echo клиент-сервер с 1-секундной задержкой и замерил производительность. Использовал три реализации: NIO, виртуальные нити и традиционные нити OS. Результаты можете посмотреть на графиках выше. NIO выиграло по всем параметрам, но отрыв от виртуальных нитей совсем небольшой. Так что NIO хоть и быстрее/эффективнее, но виртуальные нити гораздо более удобная и простая модель, а это в большинстве случаев гораздо важнее в разработке.
Но мне любопытнее показалось другое наблюдение: нити OS не уступили по пропускной способности виртуальным нитям, если было меньше ~30k соединений! А до ~5k соединений физической памяти они использовали ровно столько же! Что такое 5k соединений? Это не такая уж и маленькая нагрузка.
К чему это я? К тому, что это очередное подтверждение правила про преждевременную оптимизацию. Если вы пишете какой-нибудь простой серверок, где у вас не будет большого одновременного количества клиентов (несколько сотен в среднем и в пике до тысячи), то ничего плохого не будет, если вы его реализуете, используя тупой подход "новый поток на каждое новое соединение". А в качестве бонуса вы получите простоту отладки и читаемость кода. А когда выйдет Loom через пару лет, то вы сможете просто поменять все нити на виртуальные, оставив всю остальную часть кода неизменной. Тем временем вы сможете сконцентрироваться на других более важных бизнес-задачах.
#loom
Но мне любопытнее показалось другое наблюдение: нити OS не уступили по пропускной способности виртуальным нитям, если было меньше ~30k соединений! А до ~5k соединений физической памяти они использовали ровно столько же! Что такое 5k соединений? Это не такая уж и маленькая нагрузка.
К чему это я? К тому, что это очередное подтверждение правила про преждевременную оптимизацию. Если вы пишете какой-нибудь простой серверок, где у вас не будет большого одновременного количества клиентов (несколько сотен в среднем и в пике до тысячи), то ничего плохого не будет, если вы его реализуете, используя тупой подход "новый поток на каждое новое соединение". А в качестве бонуса вы получите простоту отладки и читаемость кода. А когда выйдет Loom через пару лет, то вы сможете просто поменять все нити на виртуальные, оставив всю остальную часть кода неизменной. Тем временем вы сможете сконцентрироваться на других более важных бизнес-задачах.
#loom
👍12🔥6