Спустя почти год моя первая книга Deep Understanding of JVM Bytecode наконец-то опубликована.
Источником идей этой книги является буклет "Байт-код JVM от входа до освоения" от Nuggets. Этот буклет - моя первая техническая колонка, и я помещаю себя в байт JVM с менталитетом подведения итогов для себя. Осаждать знание кода. После выхода Nuggets в онлайн, хотя продажи были средними, я получил много мнений и увидел много проблем с неполной системой знаний. Позже, случайно, я связался с издательством Machinery Industry Press и получил эту книгу.
Процесс написания книги был еще относительно темным, и я составил для себя план доставки на Notion.
Как и при написании кода, оценка времени слишком оптимистична, только начав писать, понимаешь, что вода действительно глубокая, шлифовка контента, верстка и корректура — все это физическая работа. После написания всей книги потребовалось почти два месяца, чтобы пересмотреть и улучшить рукопись. После выхода буклета потребовалось почти полгода, чтобы завершить всю рукопись и передать ее в издательство.
зачем писать эту книгу
Около четырех или пяти лет назад, придерживаясь концепции «код не перемещается, сначала отслеживание», я начал создавать платформу мониторинга качества обслуживания в отделе платформ компании. Первоначальный метод состоит в том, чтобы использовать метод человеческой плоти, чтобы похоронить точки, чтобы сообщить информацию мониторинга.Стоимость доступа со стороны бизнеса очень высока, и требуется от полдня до дня, чтобы похоронить точки перед выходом в Интернет, что крайне несчастен.
Позже компания активно продвигала devops, контейнеризацию и микросервисы, что повысило эффективность разработки и эксплуатации и сопровождения, но в то же время быстро проявятся проблемы, вызванные архитектурой распределенного развертывания, топология сервиса неясна, сервис зависимости сложные, логи разбросаны по разным местам. Когда возникает проблема в сети, разработчик не знает, как ее устранить, и не может быстро найти проблему. Позже я узнал, что такие технологии, как javaagent + ASM, могут автоматически внедрять скрытый код, на изучение байткода и знаний, связанных с ASM, у меня ушло около месяца, я прочитал официальный английский мануал по ASM не менее 5 раз и знаю очень хорошо.трудность в этом. Кроме того, APM, набор инструментов для мониторинга производительности, требует чрезвычайно высокой надежности и крайне низких потерь производительности, что заставило меня провести более глубокое исследование принципа выполнения байт-кода и высокопроизводительной Java.
Мне потребовалось около 3 месяцев, чтобы самостоятельно внедрить полный набор APM-системы с неинтрузивной инъекцией байт-кода с нуля до единицы, отследить весь внутренний стек вызовов микросервисов и реализовать нулевое захоронение и расширение бизнес-стороны. так как отслеживание ссылок вызовов, определение местоположения уровня кода проблемы с производительностью, обнаружение бизнес-топологии в режиме реального времени и статистика SLA в режиме реального времени гетерогенной системы процессов были онлайн в течение нескольких лет без каких-либо проблем.
Я обычно люблю кидать некоторые вещи в pojie.В начале я использовал метод прямого изменения файла класса, чтобы справиться с этим, что более громоздко. Позже, после освоения таких инструментов, как javaagent, ASM и JVMTI, я вышел из-под контроля и безболезненно использовал коммерческое программное обеспечение, такое как censum, gceay, fastthread, heapero, ELK и т. д., с целью обучения.
Позже, из отдела платформ в бизнес-отдел, я перевел большую команду, и очень рано был представлен Kotlin для серверной разработки. Из-за отсутствия знаний о синтаксическом сахаре студенты с плохой базой часто неправильно понимают значение некоторого синтаксического сахара.В ответ на эту ситуацию я сделал подробный анализ реализации большого количества грамматик в Котлине, чтобы они могут использовать его, когда они его используют Больше ясности в том, что происходит за кулисами.
Попутно я чувствую, что знания более низкого уровня более ценны, поэтому я хочу написать подобную книгу, чтобы больше людей могли лучше понять основные детали байт-кода JVM и могли анализировать его, когда они сталкиваются с проблемами. , имеют собственное независимое суждение.
аудитория
Я надеюсь, что прочитав эту книгу, вы сможете перейти от знания к знанию, понять принципы реализации классного синтаксического сахара и продвинутых фреймворков, внедрить различные черные технологии JVM и по-настоящему понять отражение, лямбда-выражения, АОП, горячую загрузку, детали реализации. за программным обеспечением pojie и т. д.
Эта книга подходит для следующих читателей.
- Читатели, имеющие предварительное представление о Java и желающие узнать больше о деталях внутренней работы.
- Читатели высокопроизводительных фреймворков, изучающие методы перезаписи байт-кода.
- Читатели, которые интересуются APM и хотят понять принцип реализации APM и создать систему APM для отслеживания цепочки вызовов распределенной системы.
- Читатели, которые хотят изучить общие методы pojie и anti-pojie программного обеспечения Java, а также улучшить свои программные реверсы и пороговые значения pojie.
Как читать эту книгу
В этой книге всего 12 глав, которые в основном разделены на две части: принцип байт-кода и его применение.
В главе 1 подробно анализируется внутренняя структура файла class.Эта часть введена для того, чтобы читатели могли легче понять принцип байт-кода, представленный далее в этой книге.
В главе 2 в начале рассказывается о том, что такое байт-код, затем рассказывается о стеке виртуальной машины Java и содержимом, связанном с фреймом стека, а затем объясняются инструкции байт-кода с помощью синтаксиса, такого как цикл for, switch-case, try-catch-finally и т. д. Использование.
В Главе 3 мы знакомим вас с байт-кодом, основная цель которого состоит в том, чтобы позволить читателям освоить базовые принципы реализации инструкций вызова метода, универсального стирания, синхронизированного ключевого слова и отражения.
Глава 4 знакомит с принципом работы компилятора Javac. Принцип компиляции — это жемчужина в короне информатики. Только поняв Javac, мы можем лучше понять принцип генерации байт-кода. В этой главе сначала представлен метод отладки исходного кода Javac, а затем подробно представлены семь этапов компиляции Javac и роль каждого этапа.
Глава 5 знакомит с языком Kotlin с точки зрения байт-кода и знакомит с принципами общего синтаксического сахара, сопрограмм и т. д. Я надеюсь, что читатели и друзья смогут сделать выводы из одного примера и использовать аналогичные идеи при изучении других языков на основе JVM.
Глава 6 знакомит с двумя инструментами для работы с байт-кодом — ASM и Javassist.Эти два инструмента очень важны и используются во многих средах промежуточного программного обеспечения.Следующие главы, посвященные APM и программному обеспечению, посвящены использованию этих двух инструментов.
Глава 7 знакомит с принципом инструментирования Java, объясняет два способа использования инструментирования и, наконец, знакомит с базовым принципом взаимодействия сокетов домена Unix в API Attach.
В главе 8 представлен принцип обработки аннотаций плагином JSR 269. Я надеюсь, что читатели смогут освоить методы модификации сгенерированного и модифицированного кода во время компиляции и понять принцип реализации инструментов Lombok и ButterKnife, изучив эту главу.
Глава 9 в основном знакомит с применением байт-кода в таких средах, как cglib, Fastjson, Dubbo, Jacoco и Mock, которые могут познакомить читателей с дополнительными сценариями использования байт-кода.
Глава 10 в основном представляет содержание, связанное с декомпиляцией, pojie, анти-pojie и обратным проектированием.Содержание этой главы состоит не в том, чтобы научить, как pojie платное программное обеспечение других людей, а в том, чтобы лучше защитить себя, поняв общие программные продукты pojie и обратных методов. .
В главе 11 представлен обзор APM, основных принципов распределенной трассировки, основных концепций OpenTracing и кодовой реализации инструментария без скрытого байт-кода.Если вы заинтересованы в APM, вы можете прочитать эту главу как введение для реализации вашего собственный продукт APM.
Глава 12 подробно описывает структуру файлов dex для Android, разницу между инструкциями байт-кода Android и инструкциями байт-кода Java и, наконец, знакомит с методом перезаписи байт-кода Gradle для достижения ненавязчивого инструментирования.
Техническое содержание байт-кода JVM огромно, и содержание этой книги — лишь верхушка айсберга. Я надеюсь, что смогу научить их, как ловить рыбу в этой книге.Если читатели и друзья смогут овладеть некоторыми инструментами и методами, прочитав эту книгу, и решить практические проблемы в процессе разработки, делая выводы из других фактов, я буду очень доволен.
Я нарисовал ментальную карту этой книги, чтобы облегчить вам понимание, как показано ниже.
благодарный
Наконец, я хотел бы поблагодарить г-на Фучуаня и Ли И из издательства, а также брата Ронга, Лао Цяня, брата Чэна и брата Чжоу Чжимина, которые написали мне рекомендации.