《GraalVM与Java静态编译:原理与应用》林子熠 | PDF下载|ePub下载
GraalVM与Java静态编译:原理与应用 版权信息
- 出版社:机械工业出版社
- 出版时间:2021-12-01
- ISBN:9787111696391
- 条形码:9787111696391 ; 978-7-111-69639-1
GraalVM与Java静态编译:原理与应用 本书特色
适读人群 :本书主要适合于以下读者:1、具有Java基础,对JVM有所了解的开发人员2、Serverless应用架构师3、编译器开发人员1)多名专家联袂推荐:北京大学计算机科学技术系主任胡振江教授、阿里蔡景现(多隆)、华为方舟编译器总架构师叶寒栋、GraalVM核心开发人员郑雨迪联袂推荐。 2)阿里资深专家撰写:作者林子熠阿里静态编译研究团队的核心成员,曾任华为高级工程师,一直从事静态编译技术的研究与落地。 3)Java应用性能提升制胜法宝:通过静态编译技术实现Java应用冷启动,实现性能质的飞跃。 4)全方位落地指导:深入原理,给出具体应用与调试技术,指导读者做好平稳落地工作。
GraalVM与Java静态编译:原理与应用 内容简介
全书逻辑上分为3篇。1.篇首先概要介绍Java编译器的演进过程,然后介绍Java静态编译的基本原理、总体能力和发展前景2.第2篇详细介绍GraalVM如何实现Java的静态编译,着重介绍是如何支持现有Java特性。3.第3篇主要关注GraalVM的实践应用。静态编译目前还未能达到开箱即用的状态,这一部分会介绍如何将传统Java应用编译为二进制可执行文件或静态库文件。通过阅读本书,读者可以了解和掌握目前新的Java静态编译技术的原理、特性和优缺点,能够判断评估自己的业务是否适用于静态编译、是否值得投入资源对现有业务进行静态化改造。
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
GraalVM与Java静态编译:原理与应用 作者简介
林子熠 博士,阿里巴巴集团技术专家,曾任华为技术有限公司高级软件开发工程师。 专注于Java静态编译方向,主要负责Java静态编译技术在阿里巴巴生态中的应用,并以落地实践中发现的问题为切入点,向GraalVM社区贡献了多项重要特性,是GraalVM社区建设的积极参与者;曾作为核心人员,负责将华为方舟编译器前端的Java字节码和Art Dex字节码转换为方舟中间语言的开发工作;曾受邀作为上海JUG2019报告嘉宾和北京QCon2020报告嘉宾,介绍GraalVM静态编译技术;曾在编译器领域国际顶级学术会议CGO 2021的Graal专项论坛中报告对Java序列化特性的静态编译支持实现。