Верхняя полка📝
СтатистикаПутевые заметки программного инженера и легкоатлета-любителя. Автор: Владимир @Toparvion Плизга Домашняя страница: https://toparvion.pro/
- Последний пост
- 13 авг.
- Последнее чтение
- 12:45
- Постов за неделю
- 2
- Всего постов
- 26
- Тип
- открытый
- Язык
- русский
- В каталоге с
- 13 авг.
- 1/24сутки в ленте
- 133
- 1/48двое суток
- 152
- 1/72трое суток
- 164
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
Мой текущий статус ☝🏼 А сколько у вас?
Коллеги, Доброго дня! А мы опубликовали следующее выступление с нашего митапа: Владимир Плизга — «Профилирование Java-приложений: подходы и инструменты». https://youtu.be/WLGYUvVt2Kk Заходите, смотрите, делитесь своим мнением, подписывайтесь и ставьте лайки — это очень важно для продвижения канала и поможет нам быстрее развивать контент!
Если вдруг вы пропустили, сообщаю, что опубликованы результаты опроса State of Java 2026. Они доступны всем желающим в виде небольшой, но ёмкой презентации: https://jokerconf.com/research/state-of-java/2026/presentation.html Напомню, что это был обстоятельный опрос #Java-разработчиков обо всём, что касается их профессии: от используемых языковых конструкций до желаемых зарплат. Я призывал вас принять в нём участие в апреле, а теперь пора пожинать плоды посмотреть, что получилось 👀 Для меня наиболее любопытными оказались мифы про VirtualThreads 🆚 WebFlux и про распределение желаемых зарплат по регионам. А что запомнилось вам? 👐
Отлов спорадичных багов с помощью BTrace 👣 Один из забористых багов, с которым мне довелось "развлекаться" в преддверии отпуска, сочетал в себе много интересного: — воспроизводился только на удалённом сервере в контуре партнёра; — требовал одновременных действий минимум 2-х человек; — не имёл чёткого набора шагов, а только некий паттерн; — из-за этого требовал по несколько попыток, чтобы проявиться. Как не трудно догадаться, там была замешана гонка потоков. Она сильно осложняла диагностику, и даже удалённое подключение отладчиком через SSH-туннель не давало результата — как только один или несколько потоков оказывались под отладкой, они переставали "шалить" и укладывались в положенные временные рамки. Словом, типичный гейзенбаг — существует только пока за ним никто не наблюдает 👻 Втыкать логирование в разные места кода и таким образом постепенно локализовывать проблему было можно, но уж очень долго и утомительно — нужно было бесконечно готовить патчи, выносить их на этот (довольно нагруженный) сервер и перезапускать его, ожидая полного прогрева. Я даже попробовал, но уже на второй итерации мне это разонравилось🤢 И тогда мне вспомнился BTrace — диагностический инструмент под зонтиком OpenJDK, позволяющий внедрять в байт-код работающего приложения различные инъекции (прямо на #Java) для доставания почти любых данных из полей и локальных переменных, в том числе аргументов методов. Из-за того, что такими инъекциями можно наломать дров, в BTrace придуман специальный DSL, сильно ограничивающий допустимые действия (например, нельзя вызывать почти никакие методы прикладного кода), но позволяющий безопасно "снюхивать" данные из многих точек приложения 👃 Основной фичей BTrace в этот раз для меня стало отслеживание зависимых вызовов — это когда для заданного метода агент реагирует не на любые вызовы, а только на те, которые произошли из тела другого (тоже заданного) метода. В тексте BTrace-скрипта выглядит это примерно так (сокращённо): @OnMethod(clazz = "SpreadsheetSession" , method = "handleCellValue" // метод-инициатор вызова , location = @Location(value = Kind.CALL , clazz = "SpreadsheetSession" , method = "calculateCellsDependentOnSingle")) // целевой (проблемный) метод public static void handleCellValue( @TargetMethodOrField String method, @ProbeMethodName String probeMethod, AnyType cellAbsRef, boolean hasManualInput) { // ... String spreadsheet = str(Reflective.get("entity", cellAbsRef)); // извлечение данных через DSL // вывод извлеченных данных (тоже на DSL) println(method + " from " + probeMethod + ": " + spreadsheet + ":" + column + row + ", manualInput: " + hasManualInput); } Это похоже на зависимые точки останова в отладчике, только никакого останова не происходит, а собранные данные выводятся в консоль, из которой запущен BTrace 🖥 Конечно, первое применение BTrace требует сильно больше времени, чем повтыкать System.out.println() или подцепиться отладчиком. Но зато потом, когда механизм освоен и отлажен, итерации диагностики вида "написал-применил-посмотрел-повторил" укорачиваются до нескольких минут и позволяют эффективно локализовывать даже такие упоротые изощрённые проблемы, как эта 🧶 Надеюсь, вам никогда не придётся отлаживать такие баги. Но если вдруг, имейте в виду, что BTrace может в этом пригодиться ✍️ — P.S. Любопытно, что 10 лет назад, когда я не знал о BTrace (хотя он уже в каком-то виде существовал), я создал собственный инструмент jMint со схожей идеей: внедрять в работающее приложение кусочки кода на Java (дроплеты), чтобы менять его поведение с целью тестирования и/или отладки. Основное отличие jMint — в отсутствии "безопасного" DSL. Причина здесь не только в слабоумии и отваге автора, но и в стремлении дать возможность заглушать нежелательное поведение или временно менять интересующее. Поэтому применение инструмента было строго ограничено тестовым контуром. Несмотря на опасности и ограничения, он неплохо прижился в моей прошлой команде и какое-то время продолжал применяться после моего ухода. Подробнее о нём можно узнать здесь 📖 —
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
Например, о том, что последовавшие за отпуском выходные оказались богатыми на #спорт 👇🏼 Сначала я поучаствовал в ежегодном местном заплыве на 5 км и, несмотря на отсутствие плавательных тренировок в отпуске, показал неплохой результат, умудрившись даже занять 3-е место в своей возрастной категории. Правда, здесь есть нюанс — всего пловцов в ней было... 4 🤭 А на следующий день мне довелось впервые сбегать 10 км в рамках благотворительного забега "Достигая цели", приуроченного ко дню железнодорожника. Здесь конкуренция была существенно выше — в мужском абсолюте среди 107 бегунов мне удалось стать лишь 17-ым. Учитывая, что специально к такой дистанции я не готовился, считаю этот результат хорошим 👌 После таких выходных, знаете ли, приятно возвращаться к работе и осознавать, что она сидячая 🫠
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
видео или голосовое, без подписи
Как не трудно догадаться, если канал вдруг затих на две недели, значит, его автор в отпуске. Так и есть, на сей раз в Горном Алтае 🏞 Но если раньше я всё же старался продолжать заниматься личными проектами и в отъездах, то нынче отпуску предшествовала такая запрессовка по работе, что на ноутбук не хотелось даже смотреть. Вкупе со слабеньким интернетом в горах, это сподвигло меня устроить цифровой детокс, и в последующие 10 дней я не открывал ноутбук вообще, а телефон использовал по минимуму. Должен признаться, мне понравилось; рекомендую 👍 Зато удалось много походить по небольшим горам, побегать вдоль завораживающих пейзажей, поплавать на лодке, катере, каяке и сапе — словом, осуществить ту пресловутую "смену обстановки", что иногда так необходима для поддержания нормальной работоспособности 👷♂️ А теперь можно приступать к новым делам и продолжать делиться новостями, благо, они есть 🙂