| 作者 |
| 张亚 彭成寒 |
| 丛书名 |
| Java核心技术系列 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9782005279285 |
| 简要 |
| 简介 |
| 这是一本揭示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字节码指令的区别。 ---------------------------JVM G1源码分析和调优--------------------------- 当Java应用程序越来越庞大、复杂,用户越来越多,没有GC(垃圾收集器)就不能保证应用程序的正常进行。G1垃圾收集器是当今GC技术最前沿的成果之一,在JDK 9中,G1被提议设置为默认垃圾收集器。本书由资深Java工程师撰写,系统介绍Java虚拟机和G1的基本原理和调优方法,为学习Java语言的学生、初级程序员提供GC的使用参考建议及经验。主要内容包括:垃圾回收算法和方法概述、G1基本概念、G1对象分配、G1优化、新生代回收(Young GC)、混合回收(Mixed GC)、Full GC、如何让选择和使用G1等。 |
| 目录 |
---------------------------深入理解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 ---------------------------JVM G1源码分析和调优--------------------------- 前 言 第1章 垃圾回收概述 1 1.1 Java发展概述 1 1.2 本书常见术语 4 1.3 回收算法概述 6 1.3.1 分代管理算法 7 1.3.2 复制算法 7 1.3.3 标记清除 8 1.3.4 标记压缩 9 1.3.5 算法小结 9 1.4 JVM垃圾回收器概述 9 1.4.1 串行回收 9 1.4.2 并行回收 10 1.4.3 并发标记回收 10 1.4.4 垃圾优先回收 10 第2章 G1的基本概念 14 2.1 分区 14 2.2 G1停顿预测模型 20 2.3 卡表和位图 22 2.4 对象头 24 2.5 内存分配和管理 27 2.6 线程 30 2.6.1 栈帧 32 2.6.2 句柄 34 2.6.3 JVM本地方法栈中的对象 36 2.6.4 Java本地方法栈中的对象 40 2.7 日志解读 40 2.8 参数介绍和调优 41 第3章 G1的对象分配 43 3.1 对象分配概述 43 3.2 快速分配 46 3.3 慢速分配 56 3.3.1 大对象分配 58 3.3.2 最后的分配尝试 60 3.4 G1垃圾回收的时机 61 3.4.1 分配时发生回收 61 3.4.2 外部调用的回收 61 3.5 参数介绍和调优 62 第4章 G1的Refine线程 64 4.1 记忆集 64 4.2 Refine线程的功能及原理 72 4.2.1 抽样线程 72 4.2.2 管理RSet 74 4.2.3 Mutator处理DCQ 78 4.2.4 Refine线程的工作原理 78 4.3 Refinement Zone 85 4.4 RSet涉及的写屏障 86 4.5 日志解读 87 4.6 参数介绍和调优 90 第5章 新生代回收 93 5.1 YGC算法概述 93 5.2 YGC代码分析 96 5.2.1 并行任务 96 5.2.2 其他处理 115 5.3 YGC算法演示 116 5.3.1 选择CSet 117 5.3.2 根处理 117 5.3.3 RSet处理 118 5.3.4 复制 119 5.3.5 Redirty 120 5.3.6 释放空间 120 5.4 日志解读 121 5.4.1 YGC日志 121 5.4.2 大对象日志分析 125 5.4.3 对象年龄日志分析 125 5.5 参数介绍和调优 126 第6章 混合回收 129 6.1 并发标记算法详解 130 6.2 并发标记算法的难点 133 6.2.1 三色标记法 133 6.2.2 难点示意图 133 6.2.3 再谈写屏障 135 6.3 G1中混合回收的步骤 141 6.4 混合回收中并发标记处理的线程 145 6.4.1 并发标记线程启动的时机 147 6.4.2 根扫描子阶段 148 6.4.3 并发标记子阶段 152 6.4.4 再标记子阶段 159 6.4.5 清理子阶段 160 6.4.6 启动混合收集 167 6.5 并发标记算法演示 170 6.5.1 初始标记子阶段 171 6.5.2 根扫描子阶段 171 6.5.3 并发标记子阶段 171 6.5.4 再标记子阶段 172 6.5.5 清理子阶段 173 6.6 GC活动图 174 6.7 日志解读 174 6.8 参数优化 178 第7章 Full GC 181 7.1 Evac失败 181 7.2 串行FGC 187 7.2.1 标记活跃对象 188 7.2.2 计算对象的新地址 190 7.2.3 更新引用对象的地址 190 7.2.4 移动对象完成压缩 193 7.2.5 后处理 194 7.3 并行FGC 196 7.3.1 并行标记活跃对象 197 7.3.2 计算对象的新地址 198 7.3.3 更新引用对象的地址 200 7.3.4 移动对象完成压缩 200 7.3.5 后处理 201 7.4 日志解读 201 7.5 参数介绍和调优 202 第8章 G1中的引用处理 203 8.1 引用概述 203 8.2 可回收对象发现 207 8.3 在GC时的处理发现列表 210 8.4 重新激活可达的引用 214 8.5 日志解读 215 8.6 参数介绍和调优 215 第9章 G1的新特性:字符串去重 217 9.1 字符串去重概述 217 9.2 日志解读 220 9.3 参数介绍和调优 222 9.4 字符串去重和String.intern的区别 222 9.5 String.intern中的实现 223 第10章 线程中的安全点 226 10.1 安全点的基本概念 226 10.2 G1并发线程进入安全点 227 10.3 解释线程进入安全点 230 10.4 编译线程进入安全点 230 10.5 正在执行本地代码的线程进入安全点 233 10.6 安全点小结 236 10.7 日志分析 236 10.8 参数介绍和调优 238 第11章 垃圾回收器的选择 241 11.1 如何衡量垃圾回收器 241 11.2 G1调优的方向 243 第12章 新一代垃圾回收器 247 12.1 Shenandoah 247 12.2 ZGC 258 附录A 编译调试JVM 262 附录B 本地内存跟踪 272 附录C 阅读JVM需要了解的C++知识 276 |