前阵子,程序员小王找到自己的老板,原因是,自己已经工作了近3年了,身边的同事薪资都比自己高,单从工作经验来讲都应该要涨薪了。
老板:小王啊,你来咱们公司也有两年多了,许多同事在这里的年限还没你长,你这次提涨薪是完全没有问题的...
程序员小王:多谢老大,我一定...
老板:但是,咱们公司的制度你也是清楚的,要么是直接涨薪,自己提的话是要经过简单的考核的,我跟同事们也有个交代不是?
程序员小王:没问题,不就问几个技术问题嘛!
老板:好的,看来你已经准备很充分了,那我今天就只问几个跟Java虚拟机有关的问题,很简单的!
程序员小王:问吧!
老板:好,先简述 java 类加载机制?
程序员小王:简单,虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的 java 类型。
老板:嗯,不错,内存模型以及分区,需要详细到每个区放什么。
程序员小王:这个...堆区、栈区、方法区,我只记得,方法区主要是储存类信息...
老板:就没了?换一个吧,描述一下 JVM 加载 Class 文件的原理机制?
程序员小王:这个...
老板:小王啊!这才三个简单的问题,你去看看随便一个Java岗的招聘信息,第一条要求就是扎实的Java基础和熟练掌握JVM,你这个水平,还要涨到12k,让我有点为难呐!
说完,主管挥了挥手,小王垂头丧气的走了。
老板(轻蔑的一笑):呵~想涨薪?在我这里门都没有!7K还不够吗?
老苏说几句:
作为开发工程师,你也许会在日常编程中被Java的启动性能和内存耗费所震惊,继而对Java语言产生怀疑;或许在使用虚拟机遇见内存溢出等一系列异常时头疼万分, 困扰于为什么会出现各种问题。
和语言朝夕相处的开发者们,提及代码的详细运行过程也难免会一时语塞。这都是由于Java虚拟机封装得太好,让使用者几乎感觉不到它的存在。虽然这种"一次编写,到处运行"优势颇多,但是却也让我们忽略了学习Java虚拟机的必要。
熟知Java虚拟机的工作原理可以大幅提升日常编程的效率,对寻常Bug的修复更是轻而易举。同时,这也是Java技术的重要组成成分之一,实现技术进阶必不可缺的知识。
Java虚拟机知识框架图
说明:限于篇幅,本文只做部分知识的拆解展示,完整的《深入学习Java虚拟机》学习文档小编已经打包整理好了,正在学习Java虚拟机或者有需要学习的朋友麻烦帮忙转发一下,然后添加vx;【MXX-0474QAQ】即可获取免费下载方式
一、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 中快速定位出问题并找到解决方案。
记得帮忙转发+转发+转发,然后添加vx;【MXX-0474QAQ】即可获取免费下载方式