本文转载自:深入学习java虚拟机,三个你从未听过的虚拟机黑科技
作为开发工程师,你也许会在日常编程中被Java的启动性能和内存耗费所震惊,继而对Java语言产生怀疑;或许在使用虚拟机遇见内存溢出等一系列异常时头疼万分, 困扰于为什么会出现各种问题。
和语言朝夕相处的开发者们,提及代码的详细运行过程也难免会一时语塞。这都是由于Java虚拟机封装得太好,让使用者几乎感觉不到它的存在。虽然这种"一次编写,到处运行"优势颇多,但是却也让我们忽略了学习Java虚拟机的必要。
熟知Java虚拟机的工作原理可以大幅提升日常编程的效率,对寻常Bug的修复更是轻而易举。同时,这也是Java技术的重要组成成分之一,实现技术进阶必不可缺的知识。
Java虚拟机知识框架图
一、Java虚拟机的基本原理
剖析 Java 虚拟机的运行机制,逐一介绍 Java 虚拟机的设计决策以及工程实现;
1. Java代码是怎么运行的?
作为一名 Java 程序员,你应该知道,Java 代码有很多种不同的运行方式。比如说可以在开发工具中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至可以在网页中运行。当然,这些执行方式都离不开 JRE,也就是 Java 运行时环境。
2. Java的基本类型
Java有八个基本类型,来支持数值计算。Java 这么做的原因主要是工程上的考虑,因为使用基本类型能够在执行效率以及内存使用两方面提升软件性能。
3. Java虚拟机是如何加载Java类的?
二、高效编译
探索 Java 编译器,以及内嵌于 Java 虚拟机中的即时编译器,帮助你更好地理解 Java 语言特性,继而写出简洁高效的代码;
14. Java虚拟机是怎么实现synchronized的
在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。
18. 即时编译器的中间表达形式
- 中间表达形式(IR)
- Sea-of-nodes
- Gloval Value Numbering
20. 方法内联
方法内联不仅可以消除调用本身带来的性能开销,还可以进一步触发更多的优化。因此,它可以算是编译优化里最为重要的一环。
三、代码优化
介绍如何利用工具定位并解决代码中的问题,以及在已有工具不适用的情况下,如何打造专属轮子;
25. 循环优化
在许多应用程序中,循环都扮演着非常重要的角色。为了提升循环的运行效率,研发编译器的工程师提出了不少面向循环的编译优化方式,如循环无关代码外提,循环展开等。
27. 注解处理器
注解(annotation)是 Java 5 引入的,用来为类、方法、字段、参数等 Java 结构提供额外信息的机制。我先举个例子,比如,Java 核心类库中的@Override注解是被用来声明某个实例方法重写了父类的同名同参数类型的方法。
32. JNI的运行机制
我们经常会遇见 Java 语言较难表达,甚至是无法表达的应用场景。比如我们希望使用汇编语言(如 X86_64 的 SIMD 指令)来提升关键代码的性能;再比如,我们希望调用 Java 核心类库无法提供的,某个体系架构或者操作系统特有的功能。
四、虚拟机黑科技
介绍甲骨文实验室近年来的前沿工作之一 GraalVM。包括如何在 JVM上高效运行其他语言;如何混搭这些语言,实现 Polyglot;如何将这些语言事前编译(Ahead-Of-Time,AOT)成机器指令,单独运行甚至嵌入至数据库中运行。
34. Graal:用Java编译Java
- Graal 和 Java 虚拟机的交互
- Graal 和 C2 的区别
- Graal 的实现
35. Truffle:语言实现框架
- Truffle 项目简介
- Partial Evaluation
- 节点重写
- Polyglot
36. SubstrateVM:AOT编译框架
- SubstrateVM 的设计与实现
- SubstrateVM 的启动时间与内存开销
- Metropolis 项目
学习感言:
Java 虚拟机日益成为互联网大厂面试的重要内容,对于 Java 开发者而言,只有在了解 Java 背后的原理后,才能写出更高质量的代码,才能在错综复杂的 bug 中快速定位出问题并找到解决方案。
网友评论