Java библиотека
31.7K subscribers
2.39K photos
82 videos
9 files
2.15K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
Бесплатный вебинар от Слёрма «Траблшутинг K8s: инструменты и лайфхаки для разработчиков».

На вебинаре:
- начнём с kubectl,
- посмотрим сайдкар контейнеры и узнаем, зачем их использовать,
- разберемся с сетевыми проблемами,
- научимся использовать strace для сложных случаев

Спикер: Виталий Лихачев, SRE в крупном нидерландском тревелтехе.

Дата: 14 мая 19:00

👉 Занять место — через бота.

В конце вебинара — подарок 🎁

Вебинар проходит в рамках курса «Kubernetes для разработчиков»

#реклама
О рекламодателе
erid: 2W5zFHBxFX6
2👍2🔥2
Живая телеметрия без overhead

Если вам нужно анализировать производительность приложения в реальном времени, но профилировщики вроде VisualVM или async-profiler слишком тяжелые, то Java Flight Recorder (JFR) Event Streaming — ваш новый лучший друг.

JFR давно встроен в JVM и собирает метрики без ощутимого влияния на производительность (накладные расходы <1%). Раньше, чтобы получить данные, нужно было снимать дамп и разбирать его постфактум. Начиная с Java 14 пакет jdk.jfr.consumer предоставляет API, благодаря которому можно стримить события в реальном времени прямо в приложение.

🟢Пример использования

Допустим, вы хотите следить за количеством вызовов System.gc() (или любыми другими JVM-событиями):
import jdk.jfr.consumer.*;

public class JfrStreamingExample {
public static void main(String[] args) {
try (var stream = EventStream.openRepository()) {
stream.onEvent("jdk.GarbageCollection", event ->
System.out.println("GC event: " + event.getLong("gcId"))
);
stream.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}

🟢Что происходит

🔘EventStream.openRepository() — подключается к JFR и слушает события онлайн
🔘onEvent("jdk.GarbageCollection", callback) — подписывается на сборку мусора
🔘stream.start(); — запускает стриминг

🟢Где полезно

1️⃣ Мониторинг продакшена — следите за GC, JIT-компиляцией, блокировками потоков без перезапуска JVM.
2️⃣ Анализ нагрузки — получайте данные о CPU, аллокациях памяти, I/O в реальном времени.
3️⃣ Трассировка медленных запросов — находите узкие места без включения дорогих профилировщиков.

🟢Что нужно знать

🔘Работает без agent'ов и почти без overhead.
🔘Доступно из коробки в OpenJDK 14+.
🔘Встроенные события JVM уже можно стримить, но для своих нужно создать Custom JFR Events.

Вы уже пробовали JFR Event Streaming?

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍126🔥3
📚 Awesome JavaFX — это тщательно подобранная коллекция ресурсов, включающая фреймворки, библиотеки, руководства и примеры кода, которые помогут ускорить написание кода.

Здесь собраны множество полезных инструментов для разработчиков всех уровней - от учебных материалов для новичков до продвинутых решений вроде TornadoFX.
Пользуйтесь ☕️

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥43
⚙️ Maven vs Gradle

🟢Maven — это инструмент сборки, использующий XML-конфигурацию (pom.xml). Популярен в Java-мире и часто применяется в корпоративных проектах.

✔️ Преимущества

— Чёткая структура проекта и стандартизация.
— Огромное количество доступных плагинов.
— Репозитории (Maven Central) делают управление зависимостями удобным.

Недостатки

— XML-файлы могут раздуваться и становиться громоздкими.
— Скорость сборки ниже по сравнению с Gradle.
— Сложнее писать кастомные задачи (Goals).

🟢Gradle — современный инструмент сборки, использующий декларативный стиль (build.gradle.kts или build.gradle). Часто применяется в Android-разработке и для микросервисов.

✔️ Преимущества

— Поддерживает Groovy и Kotlin DSL.
— Более быстрая сборка благодаря инкрементальному билду и кэшированию.
— Меньше кода в конфигурации по сравнению с Maven.

Недостатки

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

👍🏼 — Maven, 🔥 — Gradle

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍110🔥581
Forwarded from Java News
Основные паттерны микросервисной архитектуры: Strangler Fig, API Gateway, Service Mesh и другие

В данной статье мы разберем несколько ключевых паттернов, связанных с микросервисами. Речь пойдет о паттернах миграции и интеграции (таких как Strangler Fig – «удушающее дерево» и API Gateway), о сетевых и структурных паттернах (Service Mesh, Sidecar), о шаблонах работы с данными (Database per Service, CQRS) и об особом подходе к хранению состояния (Event Sourcing). Для каждого паттерна мы рассмотрим его суть, назначение, примеры использования, а также плюсы и возможные сложности. К некоторым паттернам приведены упрощенные диаграммы и фрагменты кода, чтобы иллюстративно показать, как они работают на практике.

Читать статью
👍153🔥3
🐈 BallCat — инструмент для быстрой разработки Java-проектов с акцентом на минимализм и расширяемость.

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

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94🔥3
В чем разница между map() и flatMap()?

Оба метода используются для трансформации данных в Stream, но с ключевыми отличиями:

▪️ map(Function<T, R>) применяет функцию к каждому элементу потока и возвращает поток с преобразованными элементами (Stream<R>).

▪️ flatMap(Function<T, Stream<R>>) делает то же самое, но ожидает, что функция вернет Stream<R>, а затем "выпрямляет" вложенные потоки в один Stream<R>.

📌 Пример:
List<String> words = List.of("Hello", "World");

// map(): превращает каждое слово в список символов
List<List<Character>> mapped = words.stream()
.map(word -> word.chars()
.mapToObj(c -> (char) c)
.toList())
.toList();

// flatMap(): превращает каждое слово в поток символов и "сплющивает" их в один поток
List<Character> flatMapped = words.stream()
.flatMap(word -> word.chars()
.mapToObj(c -> (char) c))
.toList();

System.out.println(mapped); // [[H, e, l, l, o], [W, o, r, l, d]]
System.out.println(flatMapped); // [H, e, l, l, o, W, o, r, l, d]

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍127
Forwarded from Java News
OpenIDE: первая российская среда разработки с поддержкой Java 24

Наконец-то состоялся официальный релиз OpenIDE – независимой российской среды разработки, которую совместно создают «Группа Астра», Axiom JDK и Haulmont.

Проект стартовал как open source-инициатива в конце прошлого года и всего за полгода прошёл путь от идеи до стабильной версии. В числе ключевых фич — поддержка Java 24 уже "из коробки", собственный маркетплейс плагинов и "многоязычность".

В статье — ключевые достижения, проблемы, а также планы по развитию OpenIDE и её экосистемы.


Читать статью
👍33😁8🔥54
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Совет💡: если ты обожаешь Ctrl + C и Ctrl + V, тебе точно понравится и Ctrl + W.

Это как выделение текста с помощью AI 😉

👩‍💻 Ссылка

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
💯12🔥42👍2🎄1
Улучшаем работу с Optional

Все используют Optional, но не все знают, как сделать это лучше. Нередко можно встретить такой код:
Optional<User> userOpt = findUserById(id);
if (userOpt.isPresent()) {
User user = userOpt.get();
processUser(user);
}


Такой код не только избыточен, но и может привести к NoSuchElementException, если забыть проверить isPresent(). Поэтому лучше использовать ifPresent(), чтобы оптимизировать код:
findUserById(id).ifPresent(this::processUser);

📌 Какие ещё варианты

— Для выполнения действия, если значение есть (ifPresent()).
— Для подстановки дефолтного значения (orElse() / orElseGet()).
— Для обработки исключений (orElseThrow()).

⚠️ Плохие практики

🔘Использовать Optional в качестве аргументов методов — это ломает читаемость API.
🔘Использовать Optional.get() без проверки — это сводит всю пользу Optional на нет.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍255🔥3
Техника «10 тестов в день» – одна из самых эффективных в изучении Java.

Канал Java Guru выложил в открытый доступ тесты, которые дают на собеседованиях в топовые компании, вроде Яндекс и MailRu.

➤ Открываете задачку – выбираете вариант – видите правильный ответ и детальное объяснение к нему. Так вы усвоите на 50% больше знаний в сжатые сроки.

Подписывайтесь и качайте свои скиллы: @javatasks
👍72🔥2
Forwarded from Java News
Cтатья про собеседования в Яшу (Yandex Weekend Offer)

Может кому-то это будет интересно, даст возможность лучше подготовиться; или наоборот кто-то примет решение не участвовать.

Коротко о себе: 41 год, senior software developer, стаж > 20 лет. Однако, как я понял, эти собесы все равно для всех одинаковые, так чтоб все написанное актуально и для молодежи.

Итак, угораздило меня согласиться на т. н. «Weekend Offer на позицию разработчика на Kotlin». Вообще‑то мне больше нравится Scala, и опыта по ней гораздо больше, но рекрутерша была сильно настойчива, и я решил обновить экспиренс, а возможно, и прибавку в деньгах. И вот что было дальше.


Читать статью
🔥21👍73
Столкнулись с падением производительности базы данных?
Не делайте резких движений: вы можете ухудшить ситуацию.

Сначала нужно верно диагностировать причину проблемы.
Возможно вы неправильно выбрали индексы, а быть может дело вообще в самой архитектуре БД – вариантов масса!

На открытом вебинаре «Как ускорить работу и повысить надёжность PostgreSQL»
вы узнаете:
🎯как обеспечить высокую производительность и отказоустойчивость базы данных
🎯как вовремя выявить деградацию производительности с помощью диагностики

Вебинар проведёт Дмитрий Золотов, Kotlin-разработчик в «Яндексе».

Приглашаем технических руководителей, админов БД, девопсов и разработчиков.

Все участники получат в подарок видеоурок «Безопасность в PostgreSQL: защита данных, управление доступом и аудит» и скидку 7% на любой курс OTUS.

6 мая, 19:00 МСК
Бесплатно
Записаться - https://otus.pw/gWI8/

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFHmzGnC
3👍3🔥2
Media is too big
VIEW IN TELEGRAM
Изучаешь Java - создай проект. Перезагрузка.

Выпуск 3. Архитектура ГРН.

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


🌐🗣СМОТРЕТЬ VKVIDEO

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥2
🔍 JSON Crack — бесплатное и открытое приложение для визуализации данных из JSON!

🌟 Приложение преобразует форматы данных, такие как JSON, YAML, XML, CSV, в интерактивные графики и диаграммы, что упрощает их анализ и понимание. Программа поддерживает множество инструментов для форматирования, преобразования, генерации JSON Schema и экспорта визуализаций в изображения.

🖥 Github

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥93
💥 Разрушители мифов

Мне НЕ нужно разбираться с управлением памятью в Java, так как за меня всё делает GC


Garbage Collector (GC) действительно очищает неиспользуемые объекты, которые больше не имеют активных ссылок. Благодаря этому в Java не нужно вручную освобождать память, как в C++.

Несколько предпосылок к исходному тезису:

🟢В других языках, где ручное управление памятью (C, C++), утечки очевидны — если забыл free(), память навсегда потеряна.
🟢В Java GC работает автоматически, поэтому кажется, что он решает все проблемы сам.
🟢"Ну раз GC есть, значит, про память можно не думать!" — типичная ошибка.

GC удаляет только те объекты, которые больше не имеют активных ссылок. Если же объект остаётся доступным, но фактически не используется, он будет занимать память до завершения работы приложения.

🔽 Несколько случаев утечек памяти

1️⃣ Статические коллекции (заполняем, но не чистим)

Если создать static List и постоянно добавлять в него объекты, они никогда не будут удалены GC, потому что статические поля живут весь срок жизни приложения.

public class MemoryLeak {
private static final List<byte[]> cache = new ArrayList<>();

public static void main(String[] args) {
while (true) {
cache.add(new byte[10 * 1024 * 1024]);
System.out.println("Добавили 10MB в кеш. Используемая память: " +
(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + "MB");
}
}
}


Через пару минут — OutOfMemoryError

2️⃣ Потоковые переменные (ThreadLocal)

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

public class ThreadLocalLeak {
private static final ThreadLocal<byte[]> threadLocalData = new ThreadLocal<>();

public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {
executor.execute(() -> {
threadLocalData.set(new byte[10 * 1024 * 1024]); // 10MB на поток
System.out.println("Память занята потоком!");
});
}

executor.shutdown();
}
}


Поток завершится, а память останется занята, потому что ThreadLocal не очищается автоматически.

3️⃣ Внутренние классы и "утекшие" ссылки

Если анонимный класс или лямбда-ссылка ссылается на внешний объект, она может мешать GC очистить его.

public class InnerClassLeak {
private String data = "Очень важные данные";

public void createAnonymousClass() {
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Используем: " + data);
}
};
new Thread(task).start();
}
}


task ссылается на data, даже если InnerClassLeak больше не используется → GC не очистит объект.

👎 Миф разрушен. GC не всемогущий и даже с ним придётся изучать, как работать с памятью в Java.

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥83
Spring Boot Tutorial for Beginners | Full Course 2025

Learn how to build real-world backend applications with Spring Boot in this hands-on crash course. Whether you're new to Spring Boot or want a solid refresher, this tutorial covers everything you need to start building Java-based REST APIs with Spiring Boot, Spring Data JPA, PostgreSQL, and Docker.

🌐🗣СМОТРЕТЬ VKVIDEO

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42🔥2
📊 MQCloud — корпоративный центр управления RocketMQ.

Это единая платформа, которая объединяет управление очередями, мониторинг и алертинг в одном интерфейсе.

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

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

🖥 GitHub

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥3
👩‍💻 Java-разработчик? Хотите ускорить разработку и избавиться от рутины?

На открытом уроке «Kotlin Multiplatform: лайфхак для Java-разработчиков» от OTUS мы покажем, как с помощью Kotlin Multiplatform (KMP) использовать один и тот же код для различных проектов — от Android и iOS до backend-систем.

Что вас ждёт:
✔️ Узнаете, как интегрировать Kotlin Multiplatform в Java-проекты и настроить совместимость с существующим стеком.
✔️ Сможете избежать дублирования логики и сэкономите время на поддержке разных модулей для разных платформ.
✔️ Получите практические знания, как создавать общий код для JVM, Android и iOS.

Открытый урок проходит в преддверии старта курса «Kotlin Backend Developer. Professional».

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Kotlin5

➡️ Встречаемся 14 мая в 20:00 МСК — присоединяйтесь и узнайте, как сэкономить время и силы с Kotlin Multiplatform: https://vk.cc/cLEh7k

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥2
Как устроен кеш в Spring Boot?

Spring Boot упрощает кеширование благодаря аннотациям и встроенной интеграции с разными кеш-провайдерами (EhCache, Caffeine, Redis и др.). Spring использует Spring Cache Abstraction, которая оборачивает кеширующую логику в аннотации:

🔘 @Cacheable — кладёт результат в кеш
🔘 @CachePut — обновляет кеш
🔘 @CacheEvict — удаляет из кеша

За кулисами используется прокси (через Spring AOP или CGLIB), который перехватывает вызовы методов, проверяет кеш и возвращает либо сохранённое значение, либо выполняет метод и кеширует результат.

🔍 Что под капотом

Если вызвать метод с @Cacheable, Spring выполняет несколько шагов:

1. Определяет ключ кеша


🔘 По умолчанию ключ формируется из параметров метода
🔘 Можно задать кастомный ключ через key = "#id"

2. Проверяет кеш-провайдер

🔘 Дефолтный провайдер — ConcurrentHashMap
🔘 Можно подключить Redis, Caffeine, EhCache и т. д.

3. Возвращает данные

🔘 Если значение есть в кеше — сразу отдаётся
🔘 Если нет – вызывается метод и результат сохраняется в кеше

⚠️ Нюансы

— Кеш работает только для Spring-управляемых бинов (если метод вызван внутри того же класса — кеш не сработает)
— Не кешируйте изменяемые объекты, иначе возможны неожиданные побочные эффекты
— Очищайте кеш, если данные меняются (@CacheEvict)

Java библиотека #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍202🔥2
📊 Данные — это топливо цифрового бизнеса. Однако передача данных между системами по-прежнему требует времени, ресурсов и нервов. Kafka Connect меняет правила игры: минимум кода, максимум автоматизации. 🔄

📅 12 мая в 18:00 МСК на открытом вебинаре от OTUS:

— Разберём архитектуру Kafka Connect;
— Запустим коннекторы для БД и файловых систем;
— Научим масштабировать и отлаживать интеграции;
— Покажем, как избежать типовых ошибок.

👤 Спикер: Валентин Шилин — старший программист/аналитик данных в зарубежной компании.

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

Открытый урок проходит в преддверии старта курса «Apache Kafka». Все участники получат скидку на обучение.

🔗 Регистрируйтесь прямо сейчас: https://vk.cc/cLEcPE

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍42🔥2