不懂 Java 虚拟机的程序员不是好的 Java 工程师

Posted MacTalk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不懂 Java 虚拟机的程序员不是好的 Java 工程师相关的知识,希望对你有一定的参考价值。

题图:by eclectic_shotz from Instagram

Java 语言自1995年正式问世以来,从崛起、问鼎、睥睨天下到进化、平稳、丢掉兵器谱头把交椅然后失而复得,经历了 Sun 的辉煌与坠落,微软的崛起与纷争,互联网的起兴、泡沫与复兴,移动互联网的大发展和 android 平台的突飞猛进。Java 语言,就像互联网大航海时代的一艘大船,虽然它的语法没那么灵活,也没那么强大,有时候看起来甚至是滞重的、笨拙的,但是,Java 在二十年来每个浪潮的转折点都恰到好处的站在了浪潮之巅。时至今日,Java 作为一门优秀的编程语言和强大的生态平台,依然屹立于程序世界之巅。

使用 Java 编程的程序员可能是这个世界上最为广泛的工程师群体,不过很多工程师仅限于使用 Java 语言和 Java 生态里的技术框架做功能实现,少有人了解 Java 的底层动力 JVM 的运营机制,以至于整体水平和认知停滞不前,成了写了十年业务表单的程序员,而不是一个优秀的工程师。

为了解决这个问题,我们邀请了 Oracle 实验室的高级研究员郑雨迪来为读者深入拆解 Java 虚拟机。

郑雨迪老师是这么说的:

为什么要学习 JVM

前不久我参加了一个国外程序员的讲座,讲座的副标题很有趣,叫做「我如何学会停止恐惧,并且爱上 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™ SE Runtime Environment 18.3 (build 10+46)
Java HotSpot™ 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 正式引入的实验性即时编译器,在国内同行口中被戏称为「甲骨文黑科技」。从技术角度来看,Graal 的工作同样是分析应用程序的性能瓶颈,寻找优化空间,只不过优化方式对自动化、通用性有更高的要求。

加入甲骨文之前,郑雨迪在瑞士卢加诺大学攻读博士学位,研究如何更加精准地监控 Java 程序,以便做出更具针对性的优化。这些研究工作均已发表在程序语言方向的顶级会议上,并获得了不少同行的认可(OOPSLA 2015最佳论文奖)。

在这 7 年的学习工作生涯中,郑雨迪读过许多大牛关于 Java 虚拟机的技术博客。在受益匪浅的同时,他发现不少文章的门槛都比较高,而且过分注重实现细节,这并不是大多数的开发人员可以受益的调优方案。这么一来,许多原本对 Java 虚拟机感兴趣的同学, 也因为过高的门槛,以及短时间内看不到的收益,而放弃了对 Java 虚拟机的学习。

而在这个专栏中,郑雨迪会用简单通俗的语言来介绍 Java 虚拟机的实现。具体到每篇文章,作者采用一个贯穿全文的案例来阐述知识点,并且给出相应的调优建议。在文章的末尾,作者还会附上一个动手实践的环节,帮助你巩固对知识点的理解。

专栏内容:

整个专栏将分为四个模块。

基本原理:剖析 Java 虚拟机的运行机制,逐一介绍 Java 虚拟机的设计决策以及工程实现;
高效实现:探索Java编译器,以及内嵌于 Java 虚拟机中的即时编译器,帮助你更好地理解Java语言特性,继而写出简洁高效的代码;
代码优化:介绍如何利用工具定位并解决代码中的问题,以及在已有工具不适用的情况下,如何打造专属轮子;
虚拟机黑科技:介绍甲骨文实验室近年来的前沿工作之一GraalVM。包括如何在JVM上高效运行其他语言;如何混搭这些语言,实现Polyglot;如何将这些语言事前编译(Ahead-Of-Time,AOT)成机器指令,单独运行甚至嵌入至数据库中运行。

我们希望借由这四个模块 36 个案例,帮助你理解 Java 虚拟机的运行机制,掌握诊断手法和调优方式。最重要的,是激发你学习 Java 虚拟机乃至其他底层工作、前沿工作的热情!

还在等啥呢?扫码订阅你的 Java 进阶专栏吧

以上是关于不懂 Java 虚拟机的程序员不是好的 Java 工程师的主要内容,如果未能解决你的问题,请参考以下文章

jdk和java虚拟机的区别

深入理解Java虚拟机的目录

深入JVM--探索Java虚拟机的类加载机制

如何把一个java程序打包成exe文件,运行在没有java虚拟机的机器上?

深入理解Java虚拟机:JVM高级特性与最佳实践的内容简介

Java虚拟机的体系结构