Шпаргалка по JVM options в Java!
Например, -Xms задаёт начальный размер heap, -Xmx ограничивает максимальный heap, а -XX:+HeapDumpOnOutOfMemoryError помогает получить дамп памяти при падении с OutOfMemoryError.
На картинке JVM options: стандартные параметры запуска, -D system properties, javaagent, non-standard -X options, GC-флаги, heap-настройки, debugging-параметры и performance options.
Сохрани, чтобы не потерять!
👉 Java Ready | #ресурс
Например, -Xms задаёт начальный размер heap, -Xmx ограничивает максимальный heap, а -XX:+HeapDumpOnOutOfMemoryError помогает получить дамп памяти при падении с OutOfMemoryError.
На картинке JVM options: стандартные параметры запуска, -D system properties, javaagent, non-standard -X options, GC-флаги, heap-настройки, debugging-параметры и performance options.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3🔥3
Делаем простой rate limiter!
Иногда нужно ограничить частоту действий: отправку писем, запросы к API, попытки входа или запуск тяжёлой операции. Соберём простой limiter, который разрешает не больше N действий за небольшой промежуток времени.
Для хранения времени запросов подойдёт очередь:
Создадим класс:
Конструктор:
Главный метод будет возвращать true, если действие разрешено:
Если в окне уже слишком много вызовов, блокируем:
Теперь можно ограничить, например, 3 попытки за 10 секунд:
Использование:
Такой limiter хранит только актуальные вызовы внутри окна. Старые записи постепенно удаляются из очереди.
Для многопоточного кода метод allow() стоит синхронизировать:
Rate limiter это простой, но очень полезный паттерн для API, авторизации, фоновых задач и защиты от слишком частых действий.
👉 Java Ready | #практика
Иногда нужно ограничить частоту действий: отправку писем, запросы к API, попытки входа или запуск тяжёлой операции. Соберём простой limiter, который разрешает не больше N действий за небольшой промежуток времени.
Для хранения времени запросов подойдёт очередь:
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayDeque;
import java.util.Deque;
Создадим класс:
public class RateLimiter {
private final int limit;
private final Duration window;
private final Deque<Instant> calls = new ArrayDeque<>();Конструктор:
public RateLimiter(int limit, Duration window) {
this.limit = limit;
this.window = window;
}Главный метод будет возвращать true, если действие разрешено:
public boolean allow() {
Instant now = Instant.now();
Instant border = now.minus(window);
while (!calls.isEmpty() && calls.peekFirst().isBefore(border)) {
calls.removeFirst();
}Если в окне уже слишком много вызовов, блокируем:
if (calls.size() >= limit) {
return false;
}
calls.addLast(now);
return true;
}
}Теперь можно ограничить, например, 3 попытки за 10 секунд:
RateLimiter limiter = new RateLimiter(
3,
Duration.ofSeconds(10)
);
Использование:
if (limiter.allow()) {
System.out.println("Запрос выполнен");
} else {
System.out.println("Слишком много запросов");
}Такой limiter хранит только актуальные вызовы внутри окна. Старые записи постепенно удаляются из очереди.
Для многопоточного кода метод allow() стоит синхронизировать:
public synchronized boolean allow() {
// та же логика
}Rate limiter это простой, но очень полезный паттерн для API, авторизации, фоновых задач и защиты от слишком частых действий.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥3
Разберём Java records: 7 приёмов для компактных моделей данных!
Records помогают быстро описывать неизменяемые объекты без лишнего шаблонного кода. Эта шпора пригодится для DTO, value objects, событий, ответов API и небольших внутренних моделей, где важны читаемость и предсказуемое поведение.
👉 Java Ready | #шпора
Records помогают быстро описывать неизменяемые объекты без лишнего шаблонного кода. Эта шпора пригодится для DTO, value objects, событий, ответов API и небольших внутренних моделей, где важны читаемость и предсказуемое поведение.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤3👍3🤝3
Чем полезен List.copyOf() в Java?
Иногда объект получает список извне и сохраняет его в поле:
На первый взгляд всё нормально. Но если внешний код потом изменит список, изменится и состояние Order:
Теперь внутри order тоже может оказаться новый элемент, хотя сам Order его не добавлял.
Чтобы защититься, можно сделать копию:
Теперь объект хранит собственный неизменяемый снимок списка:
Если исходный список изменится позже, поле внутри Order уже не поменяется:
И сам список внутри Order нельзя случайно изменить:
Обычно такой список удобно возвращать наружу:
Потому что вызывающий код не сможет незаметно изменить внутреннее состояние объекта.
Важно: List.copyOf() не принимает null-элементы:
List.copyOf() полезен для защитного копирования. Он помогает не отдавать внутреннее состояние объекта под управление внешнего кода.
👉 Java Ready | #совет
Иногда объект получает список извне и сохраняет его в поле:
public Order(List<String> items) {
this.items = items;
}На первый взгляд всё нормально. Но если внешний код потом изменит список, изменится и состояние Order:
List<String> source = new ArrayList<>();
source.add("book");
Order order = new Order(source);
source.add("phone");
Теперь внутри order тоже может оказаться новый элемент, хотя сам Order его не добавлял.
Чтобы защититься, можно сделать копию:
this.items = List.copyOf(items);
Теперь объект хранит собственный неизменяемый снимок списка:
public Order(List<String> items) {
this.items = List.copyOf(items);
}Если исходный список изменится позже, поле внутри Order уже не поменяется:
source.add("phone");
// order всё ещё хранит старый наборИ сам список внутри Order нельзя случайно изменить:
order.items().add("tablet"); // UnsupportedOperationExceptionОбычно такой список удобно возвращать наружу:
public List<String> items() {
return items;
}Потому что вызывающий код не сможет незаметно изменить внутреннее состояние объекта.
Важно: List.copyOf() не принимает null-элементы:
List.copyOf(List.of("a", null)); // NullPointerExceptionList.copyOf() полезен для защитного копирования. Он помогает не отдавать внутреннее состояние объекта под управление внешнего кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥2
Разберём CompletableFuture: 7 приёмов для асинхронного кода в Java!
CompletableFuture помогает запускать задачи параллельно, связывать async-операции, объединять результаты, обрабатывать ошибки и ограничивать время ожидания. Эта шпора пригодится, когда нужно писать неблокирующий код без хаоса из callback-ов.
👉 Java Ready | #шпора
CompletableFuture помогает запускать задачи параллельно, связывать async-операции, объединять результаты, обрабатывать ошибки и ограничивать время ожидания. Эта шпора пригодится, когда нужно писать неблокирующий код без хаоса из callback-ов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤5👍4
Маскируем секреты в URL!
Нужно логировать ссылки без риска утечки токенов? Пишем небольшой санитайзер, который находит опасные query-параметры и заменяет их значения на ****.
В этой задаче:
Такой подход помогает сохранять полезные логи для отладки, но не светить секреты в консоли, error reports и лог-файлах.
👉 Java Ready | #задача
Нужно логировать ссылки без риска утечки токенов? Пишем небольшой санитайзер, который находит опасные query-параметры и заменяет их значения на ****.
В этой задаче:
• Разбираем URL через URI;
• Проверяем имена query-параметров;
• Скрываем token, password и api_key.
Такой подход помогает сохранять полезные логи для отладки, но не светить секреты в консоли, error reports и лог-файлах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3
Например,
/bin содержит системные бинарные файлы, а /etc — конфигурации, управляющие поведением системы.На картинке — директории Linux, их назначение и место в иерархии.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥7❤3
Когда в Java стоит использовать Objects.requireNonNull()?
Иногда параметр метода не должен быть null вообще. Например, сервису нужен репозиторий, обработчику нужен клиент, а объекту доменной модели обязательное имя.
Часто это проверяют вручную:
Работает, но код становится шумным.
В Java для такой проверки есть Objects.requireNonNull():
Если передать null, ошибка появится сразу в конструкторе, а не где-то позже при первом вызове метода.
Можно добавить понятное сообщение:
Это особенно полезно в конструкторах:
И в методах, где null ломает смысл операции:
Но не стоит ставить requireNonNull() везде подряд. Если null нормальный вариант состояния, лучше явно отразить это в логике:
Objects.requireNonNull() хорош там, где null является ошибкой. Он помогает падать раньше и ближе к месту неправильного вызова.
👉 Java Ready | #совет
Иногда параметр метода не должен быть null вообще. Например, сервису нужен репозиторий, обработчику нужен клиент, а объекту доменной модели обязательное имя.
Часто это проверяют вручную:
public UserService(UserRepository repository) {
if (repository == null) {
throw new NullPointerException("repository");
}
this.repository = repository;
}Работает, но код становится шумным.
В Java для такой проверки есть Objects.requireNonNull():
public UserService(UserRepository repository) {
this.repository = Objects.requireNonNull(repository);
}Если передать null, ошибка появится сразу в конструкторе, а не где-то позже при первом вызове метода.
Можно добавить понятное сообщение:
this.repository = Objects.requireNonNull(
repository,
"repository must not be null"
);
Это особенно полезно в конструкторах:
public Order(String id, BigDecimal amount) {
this.id = Objects.requireNonNull(id, "id");
this.amount = Objects.requireNonNull(amount, "amount");
}И в методах, где null ломает смысл операции:
public void send(Message message) {
Objects.requireNonNull(message, "message");
transport.send(message);
}Но не стоит ставить requireNonNull() везде подряд. Если null нормальный вариант состояния, лучше явно отразить это в логике:
String label = user.getNickname() != null
? user.getNickname()
: user.getName();
Objects.requireNonNull() хорош там, где null является ошибкой. Он помогает падать раньше и ближе к месту неправильного вызова.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤4👍4