为什么我们要学习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 编译器是 Java 10 正式引入的实验性即时编译器,在国内同行口中被戏称为“甲骨文黑科技”。当然,在我看来,我们的工作同样也是分析应用程序的性能瓶颈,寻找优化空间,只不过我们的优化方式对自动化、通用性有更高的要求。

 

你可能感兴趣的:(为什么我们要学习Java虚拟机?)