Java: устранение проблем. Чтение, отладка и оптимизация JVM-приложений
Покупка
Новинка
Тематика:
Программирование на Java
Издательство:
ДМК Пресс
Автор:
Спилкэ Лауренциу
Перевод:
Снастин А. В.
Год издания: 2023
Кол-во страниц: 358
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Дополнительное образование
ISBN: 978-5-93700-215-0
Артикул: 855991.01.99
В этой книге рассматриваются простые и практичные методики исследования и улучшения незнакомого кода на языке программирования Java. Рассказывается о том, как эффективно использовать журналы для понимания поведения приложений; как применять методы профилирования для повышения эффективности при анализе проблем или изучении рабочих сред; как анализировать взаимодействие одних приложений с другими и осуществлять мониторинг системных событий, и обо многом другом.
Издание будет полезно начинающим и опытным разработчикам. Для чтения необходимо понимать основы языка Java.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Лауренциу Спилкэ Java: устранение проблем Чтение, отладка и оптимизация JVM-приложений
M A N N I N G SHELTER ISLAND Troubleshooting Java READ, DEBUG, AND OPTIMIZE JVM APPLICATIONS LAURENŢIU SPILCĂ
Москва, 2023 Java: устранение проблем Чтение, отладка и оптимизация JVM-приложений ЛАУРЕНЦИУ СПИЛКЭ
УДК 004.41 ББК 32.372 С72 С72 Спилкэ Лауренциу Java: устранение проблем. Чтение, отладка и оптимизация JVM-приложений / пер. с англ. А. В. Снастина. – М.: ДМК Пресс, 2023. – 356 с.: ил. ISBN 978-5-93700-215-0 В этой книге рассматриваются простые и практичные методики исследования и улучшения незнакомого кода на языке программирования Java. Рассказывается о том, как эффективно использовать журналы для понимания поведения приложений; как применять методы профилирования для повышения эффективности при анализе проблем или изучении рабочих сред; как анализировать взаимодействие одних приложений с другими и осуществлять мониторинг системных событий, и обо многом другом. Издание будет полезно начинающим и опытным разработчикам. Для чтения необходимо понимать основы языка Java. Copyright © DMK Press 2023. Authorized translation of the English edition © 2023 Manning Publications. This translation is published and sold by permission of Manning Publications, the owner of all rights to publish and sell the same. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но, поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. ISBN 978-1-61729-977-3 (англ.) Copyright © 2023 by Manning Publications Co. ISBN 978-5-93700-215-0 (рус.) © Оформление, перевод на русский язык, издание, ДМК Пресс, 2023
Оглавление Предисловие................................................................................................. 10 Благодарности.............................................................................................. 12 Об этой книге................................................................................................ 14 Об авторе...................................................................................................... 18 Об иллюстрации на обложке..................................................................... 18 ЧАСТЬ I. Основы анализа кодовой базы................................................ 19 Глава 1. Раскрытие секретов приложения............................................... 21 1.1. Как облегчить понимание работы приложения................................ 22 1.2. Типовые сценарии для использования методик анализа................. 26 1.2.1. Выяснение причины вывода неожидаемых результатов.................... 27 1.2.2. Изучение конкретных технологий........................................................ 32 1.2.3. Выяснение причин замедления............................................................ 33 1.2.4. Исследование случаев аварийного завершения приложения............. 35 1.3. Зачем нужно читать эту книгу............................................................ 38 1.4. Резюме.................................................................................................. 38 Глава 2. Изучение логики приложения с помощью методик отладки.......................................................................................................... 40 2.1. Когда недостаточно просто проанализировать код.......................... 42 2.2. Анализ кода с помощью отладчика.................................................... 45 2.2.1. Что такое трассировка стека выполнения, и как ее использовать...... 51 2.2.2. Перемещение по коду с использованием отладчика........................... 56 2.3. Когда применения отладчика может оказаться недостаточно......... 64 2.4. Резюме.................................................................................................. 65 Глава 3. Поиск главных причин возникновения проблемы с использованием расширенных методик отладки............................... 67 3.1. Минимизация времени анализа с помощью условных точек останова................................................................................................. 68 3.2. Использование точек останова, которые не приостанавливают выполнение........................................................................................... 73 3.3. Динамическое изменение сценария анализа.................................... 75 3.4. Повторное воспроизведение варианта анализа................................ 79 3.5. Резюме.................................................................................................. 85
6 Оглавление Глава 4. Удаленная отладка приложений................................................. 87 4.1. Что такое удаленная отладка............................................................... 89 4.2. Анализ в удаленных рабочих средах.................................................. 92 4.2.1. Сценарий................................................................................................. 92 4.2.2. Выявление проблем в удаленных средах............................................. 94 4.3. Резюме................................................................................................ 105 Глава 5. Максимальное использование журналов: инспектирование поведения приложения............................................107 5.1. Анализ проблем с использованием журналов................................. 111 5.1.1. Использование журналов для идентификации исключений............112 5.1.2. Использование трассировок стека исключений для определения стороны, вызывающей метод...............................................................114 5.1.3. Измерение времени, затраченного на выполнение конкретной инструкции............................................................................................116 5.1.4. Анализ проблем в многопоточных архитектурах..............................117 5.2. Реализация функций журналирования............................................ 119 5.2.1. Постоянно хранимые журналы...........................................................119 5.2.2. Определение уровней журналирования и использование рабочих сред для ведения журналов....................................................121 5.2.3. Проблемы, возникающие при журналировании, и способы их устранения........................................................................................129 5.3. Сравнение журналирования с удаленной отладкой........................ 134 5.4. Резюме................................................................................................ 136 ЧАСТЬ II. Глубокий анализ выполнения приложения.......................137 Глава 6.Выявление проблем потребления ресурсов с использованием методик профилирования......................................138 6.1. В каких случаях профилировщик оказывается полезным.............. 139 6.1.1. Выявление аномального использования ресурсов............................139 6.1.2. Как определить, какой код выполняется............................................141 6.1.3. Определение узких мест (замедлений) при выполнении приложения...........................................................................................141 6.2. Использование профилировщика.................................................... 142 6.2.1. Установка и конфигурирование профилировщика VisualVM...........142 6.2.2. Наблюдение за использованием ЦП и памяти...................................145 6.2.3. Обнаружение утечек памяти...............................................................156 6.3. Резюме................................................................................................ 161 Глава 7. Поиск скрытых проблем с использованием методик профилирования........................................................................................163 7.1. Выборка для наблюдения за выполняемым кодом.......................... 164
Оглавление 7 7.2. Профилирование с целью узнать, сколько раз выполнен метод.... 172 7.3. Использование профилировщика для идентификации SQL-запросов, выполняемых приложением..................................... 176 7.3.1. Использование профилировщика для извлечения SQL-запросов, не генерируемых фреймворком..................................176 7.3.2. Использование профилировщика для получения SQL-запросов, генерируемых фреймворком......................................182 7.3.3. Использование профилировщика для получения программно сгенерированных SQL-запросов....................................186 7.4. Резюме................................................................................................. 190 Глава 8. Использование продвинутых инструментов визуализации для профилируемых данных...................................................................192 8.1. Выявление проблем в JDBC-соединениях........................................ 193 8.2. Изучение проектного решения кода приложения с использованием графов вызовов.................................................... 206 8.3. Использование flame-графиков для обнаружения проблем с производительностью...................................................... 209 8.4. Анализ запросов в NoSQL базы данных........................................... 212 8.5. Резюме................................................................................................ 213 Глава 9. Анализ блокировок в многопоточных архитектурах............215 9.1. Мониторинг потоков с целью обнаружения блокировок................ 216 9.2. Анализ блокировок потоков.............................................................. 222 9.3. Анализ ожидающих потоков............................................................. 231 9.4. Резюме................................................................................................ 238 Глава 10. Анализ взаимоблокировок с помощью дампов потоков....240 10.1. Получение дампа потоков............................................................... 240 10.1.1. Получение дампа потока с использованием профилировщика.....243 10.1.2. Генерация дампа потоков из командной строки.............................245 10.2. Чтение дампов потоков................................................................... 249 10.2.1. Чтение дампов потоков в виде простого текста..............................249 10.2.2. Использование инструментальных средств для лучшего понимания дампов потоков.................................................................255 10.3. Резюме.............................................................................................. 257 Глава 11. Обнаружение проблем, связанных с использованием памяти, при выполнении приложения...................................................260 11.1. Выборка и профилирование для выявления проблем с памятью............................................................................................ 261 11.2. Использование дампов кучи для поиска утечек памяти............... 268
8 Оглавление 11.2.1. Получение дампа кучи.......................................................................270 11.2.2. Чтение дампа кучи.............................................................................275 11.2.3. Использование консоли OQL для запроса в дамп кучи...................279 11.3. Резюме.............................................................................................. 286 ЧАСТЬ III. Поиск проблем в крупных системах.................................287 Глава 12. Анализ поведения приложений в крупных системах.........288 12.1. Анализ обмена данными между сервисами................................... 289 12.1.1. Использование проб HTTP-сервера для наблюдения HTTP-запросов......................................................................................291 2.1.2. Использование проб HTTP-клиента для наблюдения HTTP-запросов, отправляемых приложением....................................293 12.1.3. Анализ событий низкого уровня в сокетах.......................................295 12.2. Важность интегрированного мониторинга журналов................... 298 12.3. Использование средств развертывания для анализа.................... 305 12.3.1. Использование инъекции критической ошибки для имитации трудновоспроизводимых проблем......................................................307 12.3.2. Использование зеркалирования для обеспечения тестирования и выявления ошибок.....................................................309 12.4. Резюме.............................................................................................. 310 Приложение A. Необходимые инструментальные средства..............312 Приложение B. Открытие проекта..........................................................313 Приложение C. Литература, рекомендуемая для дополнительного чтения...................................................................316 Приложение D. Понимание потоков Java...............................................318 D.1. Что такое поток.................................................................................. 318 D.2. Жизненный цикл потока.................................................................. 320 D.3. Синхронизация потоков................................................................... 323 D.3.1. Синхронизированные блоки...............................................................323 D.3.2. Использование wait(), notify() и notifyAll().................................................326 D.3.3. Присоединение потоков......................................................................328 D.3.4. Блокировка потоков на определенное время....................................329 D.3.5. Синхронизация потоков с блокирующими объектами.....................331 D.4. Проблемы, наиболее часто возникающие в многопоточных архитектурах....................................................................................... 332 D.4.1. Состояние гонки..................................................................................332 D.4.2. Взаимоблокировки..............................................................................333 D.4.3. Динамические (активные) взаимоблокировки.................................334 D.4.4. Голодание (зависание).........................................................................335 D.5. Материал для дополнительного чтения.......................................... 336
Оглавление 9 Приложение E. Управление памятью в Java-приложениях................337 E.1. Как JVM организует память приложения......................................... 338 E.2. Стек, используемый потоками для хранения локальных данных................................................................................................. 340 E.3. Куча, которую приложение использует для хранения экземпляров объектов........................................................................ 346 E.4. Метапространство – локация памяти для хранения типов данных................................................................................................. 349 Предметный указатель.............................................................................351
Предисловие Чем в действительности зарабатывает на жизнь разработчик программного обеспечения? Чаще всего ответом на этот вопрос становится фраза «реализацией программного обеспечения». Но что она означает? Это только лишь написание исходного кода? Ну уж нет. Хотя код действительно является результатом работы каждого разработчика, собственно написание исходного кода занимает всего лишь малую часть его рабочего времени. А большую часть времени разработчик программного обеспечения на самом деле использует для создания проектных решений, чтения существующего кода, понимания, как он выполняется, и изучения новых методик программирования и проектирования ПО. Написание исходного кода – это результат успешного выполнения разработчиком всех перечисленных выше задач. Таким образом, программист основную часть своего времени тратит на изучение существующих решений, а не на фактическое написание кода, реализующего новые возможности. В конечном счете чистое кодирование имеет ту же цель: научить разработчиков писать легко читаемые программные решения. Разработчики прекрасно понимают, что гораздо полезнее с самого начала написать легко читаемое решение, чем в дальнейшем тратить время, пытаясь понять его. Но нужно честно признаться в том, что не все решения являются доступными для быстрого понимания. Нам всегда будут встречаться сценарии, в которых потребуется понимание выполнения некоторой незнакомой функциональной возможности. Действительность такова: разработчики программного обеспечения тратят огромное количество времени, изучая и анализируя, как работают приложения. Они читают и исследуют код в кодовых базах приложений, а также установленные зависимости, чтобы понять до конца, почему что-то не работает так, как предполагалось. Иногда разработчики читают код только для того, чтобы выявить или лучше понять конкретную зависимость. Во многих случаях чтения кода недостаточно, и необходимо найти другие (иногда более сложные) способы исследования того, что именно делает конкретное приложение. Чтобы понять, как рабочая среда воздействует на приложение или как конкретный экземпляр JVM выполняет Java-приложение, можно воспользоваться сочетанием средств профилирования, отладки и анализа журналов. Если вам хорошо известны все возможные варианты и методики выбора наиболее подходящих инструментов, то вы сэкономите драгоценное время. Следует помнить о том, что именно на это разработчики тратят большую часть времени. Эта часть процесса разработки может стать весьма продуктивной. Я написал эту книгу, чтобы помочь людям оптимизировать процесс анализа трудностей и проблем при разработке программного обеспечения.