作者 |
林子熠 等 |
丛书名 |
Java核心技术系列 |
出版社 |
机械工业出版社 |
ISBN |
9782112201821 |
简要 |
简介 |
这是一本揭示JVM字节码“黑科技”的著作,它从原理和应用两个维度深入剖析了JVM字节码。书中内容涉及JVM字节码的大部分应用场景,如Java性能优化、软件防护与破解、APM等,通过大量实战案例讲解了它在这些场景中的实操技巧。 本书共 12 章,从逻辑上分为两大部分。 . 第一部分:原理篇(第1~8章) 第1章详细剖析了class文件的内部结构;第2章介绍了字节码的概念以及Java虚拟机栈和栈帧的相关内容;第3章介绍了字节码的进阶知识,包括泛型擦除、synchronized 关键字、反射的底层实现原理;第4章介绍了javac编译器的原理,以及javac编译的七大阶段和各阶段的作用;第5章从字节码的角度介绍Kotlin的常见语法糖、coroutine 等原理;第6章介绍了ASM和Javassist这两个字节码操作工具;第7章介绍了Java Instrumentation的原理;第8章介绍了JSR 269 插件化注解处理原理。 第二部分:应用篇(第9~12章) 第9章介绍了字节码在cglib、Fastjson等框架上的应用;第10章介绍了反编译、破解、防破解和逆向工程的相关内容;第11章介绍了APM的概况、分布式跟踪的基本原理等。第12章详细介绍了Android dex文件的组成结构,以及Android字节码指令与Java字节码指令的区别。 |
目录 |
[套装书具体书目] 8069662 - 深入理解JVM字节码 - 9787111653721 - 机械工业出版社 - 定价 89 8085007 - GraalVM与Java静态编译:原理与应用 - 9787111696391 - 机械工业出版社 - 定价 89 ---------------------------8085007 - GraalVM与Java静态编译:原理与应用--------------------------- 序 前言 第一部分 从解释执行到静态编译:Java的编译发展之路 第1章 Java静态编译技术的诞生2 1.1 Java程序的运行生命周期3 1.1.1 初始化4 1.1.2 程序预热5 1.2 冷启动问题8 1.3 初识Java静态编译技术11 1.3.1 什么是Java静态编译11 1.3.2 静态编译的优势12 1.3.3 静态编译的局限性13 1.4 小结15 第2章 Java静态编译的业界实现16 2.1 Oracle GraalVM16 2.1.1 GraalVM是什么17 2.1.2 GraalVM静态编译优点19 2.1.3 GraalVM静态编译缺点20 2.1.4 GraalVM发展分析21 2.2 华为方舟编译器22 2.3 小结24 第3章 GraalVM整体结构25 3.1 子项目与组件25 3.2 GraalVM编译系统工具mx29 3.3 在IDE中打开GraalVM32 3.4 小结33 第4章 从Java程序到本地代码:静态编译应用流程34 4.1 获取GraalVM JDK35 4.1.1 下载发布版35 4.1.2 下载Docker镜像37 4.2 从源码编译37 4.2.1 编译准备37 4.2.2 编译38 4.3 获取依赖库40 4.4 预执行目标应用程序41 4.5 静态编译目标应用程序43 4.5.1 命令行模式编译43 4.5.2 配置文件模式45 4.5.3 Maven插件模式46 4.5.4 Gradle插件模式47 4.6 静态编译Java程序实例48 4.6.1 静态编译HelloWorld49 4.6.2 静态编译Spring Boot应用实例50 4.7 小结52 第二部分 静态编译实现原理 第5章 Substrate VM静态编译框架54 5.1 静态编译启动器55 5.2 静态编译实现流程57 5.2.1 类载入59 5.2.2 准备60 5.2.3 静态分析61 5.2.4 全局构建63 5.2.5 编译64 5.2.6 生成image65 5.2.7 写文件65 5.3 Substrate VM运行时支持67 5.3.1 内存管理67 5.3.2 系统信号处理机制69 5.4 小结70 第6章 Feature机制71 6.1 Feature机制概览71 6.2 Feature管理73 6.2.1 注册与调用Feature73 6.2.2 Feature依赖74 6.3 Feature影响编译流程75 6.3.1 Feature函数的入参回调75 6.3.2 访问ImageSingletons单例库76 6.4 GraalFeature实现静态编译优化77 6.4.1 GraalVM编译器基础知识77 6.4.2 扩展lowering79 6.4.3 注册图的扩展插件79 6.5 Feature接口函数80 6.6 小结82 第7章 编译时替换机制83 7.1 替换机制在Substrate VM中的应用84 7.2 基于注解的替换85 7.2.1 替换类85 7.2.2 替换枚举类型87 7.2.3 替换函数88 7.2.4 替换构造函数89 7.2.5 替换类中的域90 7.2.6 替换类的静态初始化函数92 7.3 实现原理93 7.3.1 替换机制责任链93 7.3.2 确定待替换元素集合96 7.3.3 自定义替换内容98 7.4 小结98 第8章 类提前初始化优化100 8.1 Java中的类初始化100 8.2 编译时的类初始化101 8.2.1 类提前初始化的性能分析102 8.2.2 类提前初始化的安全性分析103 8.3 优化实现原理106 8.3.1 早期阶段分析107 8.3.2 中期阶段分析109 8.3.3 后期阶段分析111 8.4 手动设置类初始化时机112 8.5 小结113 第9章 反射的实现与优化114 9.1 反射在传统Java中的实现115 9.2 基于配置的支持119 9.2.1 反射配置文件119 9.2.2 配置局限性121 9.3 Substrate VM的反射实现122 9.3.1 解析配置并注册反射信息123 9.3.2 反射函数常量折叠优化124 9.3.3 函数反射调用过程优化125 9.4 其他类似动态特性的支持126 9.4.1 JNI调用127 9.4.2 动态代理127 9.4.3 资源访问128 9.4.4 序列化特性129 9.5 小结129 第10章 序列化131 10.1 序列化特性的JDK原生实现131 10.1.1 序列化/反序列化基本流程132 10.1.2 序列化中的静态编译不友好特性133 10.2 静态编译的序列化实现136 10.2.1 解决动态类加载问题136 10.2.2 解决new抽象类问题138 10.2.3 静态初始化函数检查139 10.3 局限性139 10.4 小结141 第11章 跨语言编程:用Java语言编写共享库142 11.1 样例项目cinterfacetutorial 143 11.2 共享库的Java实现源码解析145 11.2.1 声明共享库上下文145 11.2.2 实现C基本数据结构146 11.2.3 实现C的结构体继承149 11.2.4 暴露共享库API149 11.2.5 直接调用C函数152 11.2.6 共享库函数的返回值153 11.3 静态编译JNI共享库153 11.3.1 JNIDemo项目组织结构153 11.3.2 JNI库API函数的声明155 11.3.3 JNI函数编程基本过程156 11.3.4 JNI函数参数传入String157 11.3.5 自定义JNI函数指针类型158 11.3.6 调用Java函数159 11.4 小结160 第12章 CLibrary机制161 12.1 isolate161 12.1.1 错误的多线程调用:简单复用isolate162 12.1.2 正确的多线程调用:为每个线程新建isolate163 12.1.3 正确的多线程调用:映射线程与isolate164 12.2 WordBase接口系统165 12.3 注解系统167 12.3.1 @CContext注解167 12.3.2 @CEntryPoint注解172 12.3.3 @InvokeCFunctionPointer注解173 12.4 正确释放内存173 12.5 小结175 第三部分 静态编译实战 第13章 静态编译Serverless应用到阿里云函数计算平台178 13.1 阿里云函数计算平台178 13.2 静态编译基于Micronaut的Spring-Boot示例项目179 13.3 部署到阿里云180 13.4 性能比较180 13.5 小结182 第14章 native-image-agent的实现183 14.1 native-image-agent与JVMTI183 14.2 实现静态编译的JVMTI Agent185 14.3 native-image-agent的可用选项188 14.4 小结190 第15章 调试191 15.1 编译debug版本的native image191 15.2 使用GDB调试native image193 15.2.1 启动GDB194 15.2.2 增加函数断点194 15.2.3 GDB TUI分屏界面195 15.2.4 单步调试197 15.2.5 查看Java对象的值197 15.3 小结199 ---------------------------8069662 - 深入理解JVM字节码--------------------------- 前 言 第1章 深入剖析 class 文件结构 1 1.1 初探 class 文件 1 1.2 class 文件结构剖析 3 1.2.1 魔数 4 1.2.2 版本号 6 1.2.3 常量池 7 1.2.4 Access flags 18 1.2.5 this_class、super_name、interfaces 19 1.2.6 字段表 20 1.2.7 方法表 23 1.2.8 属性表 25 1.3 使用 javap 查看类文件 30 1.4 小结 32 第2章 字节码基础 33 2.1字节码概述 33 2.2Java 虚拟机栈和栈帧 34 2.3 字节码指令 41 2.3.1 加载和存储指令 41 2.3.2 操作数栈指令 42 2.3.3 运算和类型转换指令 45 2.3.4 控制转移指令 46 2.3.5 for语句的字节码原理 48 2.3.6 switch-case底层实现原理 54 2.3.7 String的switch-case实现的字节码原理 55 2.3.8 ++i和i++的字节码原理 60 2.3.9 try-catch-finally的字节码原理 63 2.3.10 try-with-resources 的字节码原理 71 2.3.11 对象相关的字节码指令 74 2.4 小结 77 第3章 字节码进阶 78 3.1 方法调用指令 78 3.1.1 invokestatic指令 79 3.1.2 invokevirtual指令 79 3.1.3 invokespecial指令 80 3.1.4 invokeinterface指令 80 3.1.5 invokedynamic指令 90 3.2 Lambda 表达式的原理 95 3.3 泛型与字节码 100 3.4 synchronized 的实现原理 102 3.5 反射的实现原理 106 3.5.1 反射方法源码分析 107 3.5.2 反射的inflation机制 109 3.6 小结 110 第4章 javac 编译原理简介 111 4.1 javac 源码调试 112 4.2 javac 的七个阶段 114 4.2.1 parse阶段 115 4.2.2 enter阶段 116 4.2.3 process阶段 118 4.2.4 attr阶段 118 4.2.5 flow阶段 121 4.2.6 desugar阶段 122 4.2.7 generate阶段 126 4.3 小结 129 第5章 从字节码角度看 Kotlin语言 130 5.1 Metadata 注解 130 5.2 顶层方法 132 5.3 object 单例 133 5.4 扩展方法 134 5.5 接口默认方法 135 5.6 默认参数 137 5.7 高级 for 循环 140 5.8 data class 142 5.9 多返回值 143 5.10 协程的实现原理 144 5.10.1 CPS 介绍 145 5.10.2 suspend 关键字 146 5.11 从字节码分析 Kotlin 编译器的bug 149 5.12 小结 153 第6章 ASM 和 Javassist 字节码操作工具 154 6.1 ASM 介绍 154 6.1.1 ASM Core API核心类 156 6.1.2 ASM操作字节码示例 158 6.2 Javassist 介绍 169 6.2.1 Javassist核心API 169 6.2.2 Javassist操作字节码示例 170 6.3 小结 174 第7章 Java Instrumentation 原理 175 7.1 Java Instrumentation 简介 175 7.2 Instrumentation 与 -javaagent启动参数 176 7.3 JVM Attach API 介绍 180 7.3.1 JVM Attach API基本使用 181 7.3.2 JVM Attach API的底层原理 183 7.4 小结 190 第8章 JSR 269 插件化注解处理原理 191 8.1 JSR 269 简介 191 8.2 抽象语法树操作 API 193 8.2.1 Names介绍 193 8.2.2 JCTree介绍 193 8.2.3 TreeMaker介绍 198 8.2.4 自定义注解处理实战 202 8.3 JSR 269 在常用框架上的应用 207 8.3.1 案例一:ButterKnife 207 8.3.2 案例二:Lombok 209 8.4 小结 212 第9章 字节码的应用 213 9.1 cglib 动态代理原理分析 213 9.1.1 cglib核心API介绍 214 9.1.2 cglib原理分析 216 9.2字节码在 Fastjson 上的应用 218 9.3 字节码在 Dubbo 上的应用 221 9.4 字节码在 JaCoCo 代码覆盖率上的应用 222 9.5 字节码在 Mock 上的应用 225 9.6 小结 227 第10章 软件破解和防破解 228 10.1 反编译 228 10.2 软件破解 229 10.2.1 破解方式一:直接修改class文件 230 10.2.2 破解方式二:javaagent无痛破解 232 10.3 软件防破解 234 10.3.1 自定义ClassLoader 234 10.3.2 JNI隐藏核心逻辑 237 10.3.3 基于JVMTI的加密方案 239 10.3.4 混淆 245 10.4 小结 250 第11章 全链路分布式跟踪与APM 251 11.1 全链路分布式跟踪介绍 251 11.1.1 什么是全链路分布式跟踪 252 11.1.2 OpenTracing基本术语 253 11.1.3 分布式跟踪的实现和上下文传递 254 11.2 见微知著之 APM 260 11.2.1 APM基本概念 260 11.2.2 APM的字节码注入实现 261 11.2.3 其他平台的APM实现 272 11.3 小结 273 第12章 Android字节码与 APM 274 12.1 dex 文件结构 274 12.1.1 header 276 12.1.2 string_ids 278 12.1.3 type_ids 280 12.1.4 proto_ids 281 12.1.5 field_ids 282 12.1.6 method_ids 283 12.1.7 class_defs 284 12.1.8 data 288 12.1.9 link_data 288 12.2 Android字节码 288 12.2.1 Android字节码概述 288 12.2.2 常见的字节码指令介绍 289 12.3 Gradle 插件编写 295 12.3.1 自定义Gradle插件 295 12.3.2 独立的 Gradle 插件项目 296 12.4 Android字节码注入原理 297 12.4.1 Transform API介绍 297 12.4.2 字节码注入代码实现 299 12.5 小结 301 |