kill -15 даёт ядру возможность завершить процесс аккуратно, чтобы тот успел всё почистить и закрыть как положено.
kill -9 — это уже жёсткий килл, без шансов на «прощальную речь». Процесс просто вырубается, не успев освободить ресурсы или записать данные.
Вот пример с node http-server: при обычном завершении (-15) он корректно закрывает соединения, а при -9 просто падает без возможности что-то доработать.
Короче, будь готов к -9, но надейся на -15.
👉 Java PortalМ
kill -9 — это уже жёсткий килл, без шансов на «прощальную речь». Процесс просто вырубается, не успев освободить ресурсы или записать данные.
Вот пример с node http-server: при обычном завершении (-15) он корректно закрывает соединения, а при -9 просто падает без возможности что-то доработать.
Короче, будь готов к -9, но надейся на -15.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
Дерево зависимостей Spring Boot 4, где в деле видно Jackson 3
Обрати внимание на новые пакеты tools.jackson.* (ядро Jackson 3), идущие вместе с com.fasterxml.jackson.annotations:2.20. Это не ошибка — Jackson 3 специально использует те же аннотации, что и в версии 2, ради совместимости
👉 Java Portal
Обрати внимание на новые пакеты tools.jackson.* (ядро Jackson 3), идущие вместе с com.fasterxml.jackson.annotations:2.20. Это не ошибка — Jackson 3 специально использует те же аннотации, что и в версии 2, ради совместимости
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
Совет по Java: в циклах лучше использовать StringBuilder, а не String для конкатенации строк.
String - неизменяемый объект, из-за чего при каждой конкатенации создаётся новая строка. Это сильно бьёт по производительности, особенно в больших циклах.
StringBuilder - изменяемый, заточен под многократное добавление строк и работает куда быстрее.
👉 Java Portal
String - неизменяемый объект, из-за чего при каждой конкатенации создаётся новая строка. Это сильно бьёт по производительности, особенно в больших циклах.
StringBuilder - изменяемый, заточен под многократное добавление строк и работает куда быстрее.
// Неэффективный способ:
String result = "";
for (int i = 0; i < 1000; i++) {
result += i; // при каждой итерации создаётся новый объект String
}
// Более эффективный способ:
StringBuilder result = new StringBuilder();
for (int i = 0; i < 1000; i++) {
result.append(i); // добавление в тот же буфер, без лишних аллокаций
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤2
Spring Boot 4 + Jackson 3 сделали клиентскую фильтрацию через
Раньше приходилось оборачивать объекты в😫
Теперь всё проще — просто используй
👉 Java Portal
@JsonView гораздо аккуратнее и удобнееРаньше приходилось оборачивать объекты в
MappingJacksonValue Теперь всё проще — просто используй
.hint()Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2
Камень/ножницы/бумага, реализовано на Java25 в
👉 Java Portal
https://Game.javavoid main() {
IO.println("rock/paper/scissors:");
var u = IO.readln(); // читаем ввод пользователя
if (u.equals("exit")) return; // выходим, если введено "exit"
var c = "rock,paper,scissors".split(","); // список вариантов
var i = List.of(c).indexOf(u); // индекс выбранного пользователем варианта
if (i < 0) return; // если введено что-то не из списка — выходим
var j = new Random().nextInt(3); // случайный выбор компьютера
IO.println("Computer: " + c[j]);
IO.println(i == j ? "Tie!" : (i == (j + 1) % 3 ? "You win!" : "Computer wins!"));
}Please open Telegram to view this post
VIEW IN TELEGRAM
👀7❤6🔥3
Spring Boot: можно использовать
✅ Один из возможных поводов сделать это когда у тебя есть своя конфигурация, которая конфликтует со стандартной.
👉 Java Portal
@SpringBootApplication(exclude = …), чтобы отключить определённые классы автоконфигурации.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🤔1
Если нужно внедрить сгруппированные конфигурационные параметры в классы, можно использовать аннотацию
👉 Java Portal
@ConfigurationProperties вместо @Value@Value обычно применяют для внедрения отдельных свойств:@Value("${app.name}")
private String appName;@ConfigurationProperties лучше подходит для более сложных, сгруппированных настроек:email:
host: smtp.example.com
port: 587
username: [email protected]
password: secret
@Component
@ConfigurationProperties(prefix = "email")
public class EmailProperties {
private String host;
private int port;
private String username;
private String password;
// геттеры и сеттеры
}
@Service
public class EmailService {
private final EmailProperties emailProperties;
public EmailService(EmailProperties emailProperties) {
this.emailProperties = emailProperties;
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
Разбор логов при запуске Spring Boot
Когда запускаешь Spring Boot и в консоли пролетают тонны логов - вот что это всё значит:
1. Spring Boot Banner
Сначала появляется ASCII-баннер с версией Spring Boot:
:: Spring Boot :: (v3.3.4)
Он показывает версию приложения и данные JVM.
2. Стартовая информация
Пример строки:
Starting DemoApplication using Java 21 on LAPTOP with PID 4523
Отображает главный класс, версию Java и PID процесса.
3. Активные профили
Если видишь:
The following profiles are active: dev
Значит, загружается
4. Инициализация ApplicationContext
Spring создаёт
Пример лога:
Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
5. Фаза автоконфигурации
Spring Boot подхватывает
Пример:
Tomcat initialized with port(s): 8080 (http)
Хочешь увидеть детали — запускай с флагом
6. Создание и инициализация бинов
Типичный лог:
Initializing Spring DispatcherServlet 'dispatcherServlet'
Это значит, что веб-слой готов принимать запросы.
7. Запуск веб-сервера
В зависимости от стека:
- Tomcat — для Spring MVC
- Netty — для WebFlux
Пример:
Tomcat started on port(s): 8080 (http) with context path ''
8. Метрики старта
Spring Boot 3.x добавил
9. Приложение готово
Финальный лог:
Started DemoApplication in 2.345 seconds (JVM running for 2.789)
Контекст полностью загружен, приложение работает.
Как посмотреть всё в реальном времени
Запусти приложение с флагом
java -jar app.jar --debug
Ты получишь детализированный отчёт об автоконфигурации и последовательности запуска — удобно для отладки и понимания, что реально происходит при старте.
👉 Java Portal
Когда запускаешь Spring Boot и в консоли пролетают тонны логов - вот что это всё значит:
1. Spring Boot Banner
Сначала появляется ASCII-баннер с версией Spring Boot:
:: Spring Boot :: (v3.3.4)
Он показывает версию приложения и данные JVM.
2. Стартовая информация
Пример строки:
Starting DemoApplication using Java 21 on LAPTOP with PID 4523
Отображает главный класс, версию Java и PID процесса.
3. Активные профили
Если видишь:
The following profiles are active: dev
Значит, загружается
application-dev.yml — удобно для конфигов под разные окружения.4. Инициализация ApplicationContext
Spring создаёт
ApplicationContext, сканирует компоненты, конфигурации и автоконфигурации.Пример лога:
Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
5. Фаза автоконфигурации
Spring Boot подхватывает
AutoConfiguration-классы и автоматически связывает бины.Пример:
Tomcat initialized with port(s): 8080 (http)
Хочешь увидеть детали — запускай с флагом
--debug или --trace.6. Создание и инициализация бинов
Типичный лог:
Initializing Spring DispatcherServlet 'dispatcherServlet'
Это значит, что веб-слой готов принимать запросы.
7. Запуск веб-сервера
В зависимости от стека:
- Tomcat — для Spring MVC
- Netty — для WebFlux
Пример:
Tomcat started on port(s): 8080 (http) with context path ''
8. Метрики старта
Spring Boot 3.x добавил
StartupStep-метрики, чтобы отслеживать, на что уходит время при старте (видно, если включён Actuator).9. Приложение готово
Финальный лог:
Started DemoApplication in 2.345 seconds (JVM running for 2.789)
Контекст полностью загружен, приложение работает.
Как посмотреть всё в реальном времени
Запусти приложение с флагом
--debug:java -jar app.jar --debug
Ты получишь детализированный отчёт об автоконфигурации и последовательности запуска — удобно для отладки и понимания, что реально происходит при старте.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5
Проект, который я советую каждому разработчику сделать хотя бы раз, написать свой парсер JSON, который превращает строку в нативный объект языка, например словарь.
Формат JSON настолько привычен, что мы просто пользуемся готовыми парсерами и редко задумываемся, как они устроены внутри. Вот основные шаги, если хочешь собрать такой парсер с нуля:
Разобраться со спецификацией JSON.
Написать токенайзер, который выделяет токены из строки (можно использовать Lex).
Определить грамматику JSON по спецификации с помощью Yacc.
Реализовать обработку ошибок, красивый вывод и указание позиции ошибки в строке.
Собрать нативный объект языка — словарь, hashmap и т.д.
Прогнать реализацию на тестах, чтобы убедиться в корректности.
Если хочешь усложнить задачу — не используй Lex и Yacc, а напиши токенайзер и парсер полностью вручную, специально под JSON, без универсальности.
Сделав такой проект, ты не только поймёшь, как работает JSON, но и:
почему его парсинг считается относительно медленным и затратным
как устроена стадия парсинга в любом компиляторе
насколько всё это интересно, если копнуть глубже
Этот проект реально прокачает твои навыки решения задач. Если решишься, то желаю удачи!
👉 Java Portal
Формат JSON настолько привычен, что мы просто пользуемся готовыми парсерами и редко задумываемся, как они устроены внутри. Вот основные шаги, если хочешь собрать такой парсер с нуля:
Разобраться со спецификацией JSON.
Написать токенайзер, который выделяет токены из строки (можно использовать Lex).
Определить грамматику JSON по спецификации с помощью Yacc.
Реализовать обработку ошибок, красивый вывод и указание позиции ошибки в строке.
Собрать нативный объект языка — словарь, hashmap и т.д.
Прогнать реализацию на тестах, чтобы убедиться в корректности.
Если хочешь усложнить задачу — не используй Lex и Yacc, а напиши токенайзер и парсер полностью вручную, специально под JSON, без универсальности.
Сделав такой проект, ты не только поймёшь, как работает JSON, но и:
почему его парсинг считается относительно медленным и затратным
как устроена стадия парсинга в любом компиляторе
насколько всё это интересно, если копнуть глубже
Этот проект реально прокачает твои навыки решения задач. Если решишься, то желаю удачи!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11😁5💊2👍1
Большинство разработчиков пользуются всего парой Git команд.
Вот еще 15, которые сэкономят вам кучу времени.
👉 Java Portal
Вот еще 15, которые сэкономят вам кучу времени.
git stash → Сохранить работу без коммита. Можно прыгать по веткам, не теряя правки.
git reflog → Находит потерянные коммиты. Спасательный круг, если что-то пошло не так с git reset.
git bisect → Двоичный поиск по коммитам, чтобы вычислить баг. Гораздо быстрее ручной проверки.
git rebase -i → Причесывает историю перед пушем. Сквош, перестановка или правка коммитов.
git cherry-pick → Применяет нужные коммиты в другую ветку. Без полноценного merge.
git diff --staged → Показывает, что именно пойдет в коммит. Помогает поймать косяки заранее.
git commit --amend → Поправить последний коммит или добавить забытые файлы.
git reset HEAD~1 → Откатывает последний коммит, но оставляет изменения. Начинаешь заново, ничего не теряя.
git clean -fd → Удаляет все неотслеживаемые файлы и папки. Полная очистка, когда нужно начать на чистую.
git log --oneline --graph → Компактная визуализация истории. Ветки и слияния видно как на ладони.
git blame → Показывает, кто и когда писал каждую строку. Удобно искать момент появления бага.
git show → Детальная инфа по любому коммиту. И изменения, и метаданные.
git remote -v → Список всех удаленных репозиториев. Полезно, чтобы проверить, куда вы пушите.
git fetch --prune → Обновляет информацию о ремоутах и удаляет устаревшие ветки.
git diff branch1..branch2 → Сравнивает две ветки. Видно, что именно в них различается.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤5