You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
6.4 KiB
Markdown

2 years ago
# 开篇词 | 为什么我们要学习Java虚拟机
前不久我参加了一个国外程序员的讲座讲座的副标题很有趣叫做“我如何学会停止恐惧并且爱上Java虚拟机”。
这句话来自一部黑色幽默电影《奇爱博士》,电影描述了冷战时期剑拔弩张的氛围。
程序员之间的语言之争又未尝不是如此。写系统语言的鄙视托管语言低下的执行效率;写托管语言的则取笑系统语言需要手动管理内存;写动态语言的不屑于静态语言那冗余的类型系统;写静态语言的则嘲讽动态语言里面各种光怪陆离的运行时错误。
Java作为应用最广的语言自然吸引了不少的攻击而身为Java程序员的你或许在口水战中落了下风忿忿于没有足够的知识武装自己又或许想要深入学习Java语言却又无从下手。甚至是在实践中被Java的启动性能、内存耗费所震惊因此对Java语言本身产生了种种的怀疑与顾虑。
别担心我就是来解答你对Java的种种疑虑的。“知其然”也要“知其所以然”学习Java虚拟机的本质更多是了解Java程序是如何被执行且优化的。这样一来你才可以从内部入手达到高效编程的目的。与此同时你也可以为学习更深层级、更为核心的Java技术打好基础。
我相信在不少程序员的观念里Java虚拟机是透明的。在大家看来我们仅需知道Java核心类库以及第三方类库里API的用法便可以专注于实现具体业务并且依赖Java虚拟机自动执行乃至优化我们的应用程序。那么我们还需要了解Java虚拟机吗
我认为是非常有必要的。如果我们把核心类库的API比做数学公式的话那么Java虚拟机的知识就好比公式的推导过程。掌握数学公式固然可以应付考试但是了解背后的推导过程更加有助于记忆和理解。并且在遇到那些没法套公式的情况下我们也能知道如何解决。
具体来说了解Java虚拟机有如下但不限于好处。
首先Java虚拟机提供了许多配置参数用于满足不同应用场景下对程序性能的需求。学习Java虚拟机你可以针对自己的应用最优化匹配运行参数。你可以用下面这个例子看一下自己虚拟机的参数列表。
```
举例来说macOS上的Java 10共有近千个配置参数
$ java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version | wc -l
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
812
```
其次Java虚拟机本身是一种工程产品在实现过程中自然存在不少局限性。学习Java虚拟机可以更好地规避它在使用中的Bug也可以更快地识别出Java虚拟机中的错误
再次Java虚拟机拥有当前最前沿、最成熟的垃圾回收算法实现以及即时编译器实现。学习Java虚拟机我们可以了解背后的设计决策今后再遇到其他代码托管技术也能触类旁通。
最后Java虚拟机发展到了今天已经脱离Java语言形成了一套相对独立的、高性能的执行方案。除了Java外Scala、Clojure、Groovy以及时下热门的Kotlin这些语言都可以运行在Java虚拟机之上。学习Java虚拟机便可以了解这些语言的通用机制甚至于让这些语言共享生态系统。
说起写作这个专栏的初心与我个人的经历是分不开的我现在是甲骨文实验室的高级研究员工作主要是负责研究如何通过程序分析技术以及动态编译技术让程序语言跑得更快。明面上我是Graal编译器的核心开发者之一在为HotSpot虚拟机项目拧螺丝。
这里顺便说明一下Graal编译器是Java 10正式引入的实验性即时编译器在国内同行口中被戏称为“甲骨文黑科技”。当然在我看来我们的工作同样也是分析应用程序的性能瓶颈寻找优化空间只不过我们的优化方式对自动化、通用性有更高的要求。
加入甲骨文之前我在瑞士卢加诺大学攻读博士学位研究如何更加精准地监控Java程序以便做出更具针对性的优化。这些研究工作均已发表在程序语言方向的顶级会议上并获得了不少同行的认可OOPSLA 2015最佳论文奖
在这7年的学习工作生涯中我拜读过许多大神关于Java虚拟机的技术博客。在受益匪浅的同时我发觉不少文章的门槛都比较高而且过分注重实现细节这并不是大多数的开发人员可以受益的调优方案。这么一来许多原本对Java虚拟机感兴趣的同学 也因为过高的门槛以及短时间内看不到的收益而放弃了对Java虚拟机的学习。
在收到极客时间的邀请后我决定也挑战一下Java虚拟机的科普工作。和其他栏目一样我会用简单通俗的语言来介绍Java虚拟机的实现。具体到每篇文章我将采用一个贯穿全文的案例来阐述知识点并且给出相应的调优建议。在文章的末尾我还将附上一个动手实践的环节帮助你巩固对知识点的理解。
整个专栏将分为四大模块。
1. **基本原理**剖析Java虚拟机的运行机制逐一介绍Java虚拟机的设计决策以及工程实现
2. **高效实现**探索Java编译器以及内嵌于Java虚拟机中的即时编译器帮助你更好地理解Java语言特性继而写出简洁高效的代码
3. **代码优化**:介绍如何利用工具定位并解决代码中的问题,以及在已有工具不适用的情况下,如何打造专属轮子;
4. **虚拟机黑科技**介绍甲骨文实验室近年来的前沿工作之一GraalVM。包括如何在JVM上高效运行其他语言如何混搭这些语言实现Polyglot如何将这些语言事前编译Ahead-Of-TimeAOT成机器指令单独运行甚至嵌入至数据库中运行。
我希望借由这四个模块36个案例帮助你理解Java虚拟机的运行机制掌握诊断手法和调优方式。最重要的是激发你学习Java虚拟机乃至其他底层工作、前沿工作的热情。
## 知识框架图
![](https://static001.geekbang.org/resource/image/41/77/414248014bf825dd610c3095eed75377.jpg)
点击查看高清大图iOS用户可长按保存