jvm虚拟机的解释执行逻辑和嵌入式设备的c语言执行过程比较像。

这里我还是先说结论。我们知道,嵌入式设备的执行过程:

1. c语言编码调试开发。

2. IDE将c语言转义成嵌入式设备相关的汇编语言。

3. 汇编语言转为嵌入式设备机器码烧入设备。

然后嵌入式设备即可执行我们编写的相关指令。

类似的,jvm执行过程与这个非常相近。

1. javac编译源文件,把java文件转为class文件。class文件可认为是jvm的汇编语言文件。

2. jvm根据jvm规范中规定的汇编指令集,按指令解析,执行class文件描述的内容。

当然,这里可能还包括jvm的垃圾回收,内存模型逻辑,jit编译,class文件头的一些锁逻辑等等。。。。这里不在展开。大致过程如图:

java的开发者非常聪明。我们知道,这种解释执行语言号称一次编译到处运行。在早期,计算机语言都是与平台相关的。各个平台的编译器,对应的编译产物都不相同。

本质上我们是通过不同的编译,来适应不同的执行环境。为了实现垮平台执行,也有一些尝试做跨平台的编译器。但是成本高,而且仍然需要编译3套源码。

既然跨系统开发编译器不明智,那么,跨系统开发执行环境呢?

显然这个逆袭思维就成了目前跨平台执行语言的主要实现思想。这个逆向思维在很多计算机技术上都有体现。

之前我回答过关于如何学java的问题。这里贴出回答中jvm相关的那部分。可以点击我的回答,去查看完整内容。


--理解jdk,jre即jvm原理和实现。

这里我推荐看下葛老师的《实战java虚拟机》,里面讲解比较偏实操。容易上手理解。

首先,可以从jdk自带的工具学习来入手。

比如:jstat,jmap,jstack,jps,jdb.......甚至还有直接可以窥视运行期间实际内存数据的HSDB。当然,作为学习初步,我们只需要理解常用的几个命令,并知道其代表的意义即可。毕竟,第三方监控工具,包括jdk本身也提供了3个可视化的监控。

其次,理解jvm的运行载入原理,搞懂class文件结构。

这个过程我们可以借助之前会用的监控工具,理解jvm载入的基本原理。可以参考官方各个版本的jvm标准,学习看懂class文件。在此基础上可以使用如classpy等工具,方便我们直接阅读class文件。也可以试试支持class位元组码级别的单步调试工具。甚至,可以尝试用用jvm汇编编码工具。

接下来,理解jvm的垃圾回收机制发展历史和各个主流垃圾回收器的工作原理。

这个过程其实非常复杂。垃圾回收器有各种串列,并行,新声代/swap和老年代,以及回收警戒线,full触发条件,各种个样的基本参数和不怎么用的超参数,以及G1的H区,ZGC等等。。。还好的是,GC并不属于jvm官方规范的一部分。

然后,动手做一些jvm的实践和实战,

比如,jvm常见的故障排查和故障总结,性能调优,热载入,class位元组码的动态操作,asm等。

最后,可以尝试实现自己的jvm。(当然这个步骤,对很多同学来说不是必须了)

这里我推荐几本书,也是彻底搞懂jvm规范的学习路径。最好自己实现垃圾回收器。

周老师的《深入理解Java虚拟机》。

接下来是《深入嵌入式java虚拟机》和配套源码。这个cldc的jvm源码只有1M多。目前在oracle的官网上,仍然可以下载。是一个设计非常精简的jvm实现。

接下来,可以去阅读《自己动手写java 虚拟机》。这本书的jvm实现是采用go语言编写。当然其中也有很多设计并不是非常合理。但基本都遵循了jvm规范。

这个时候就可以去看看github上各种jvm的开源实现了。有go,scalajvm,javainjava,ajvm,python-jvm,lua,各个版本各个不同的jvm实现。

当然,这些实现都只是基本原理。

后面推荐你去看《实战hotspot》豹子书,关注高级语言虚拟机的圈子。

当然,垃圾回收的书籍比较少,这里还是推荐给你垃圾回收的经典书《The Garbage Collection Cookbook》。实际上对新的垃圾回收演算法有兴趣,可以去知乎搜索相关的论文和GC演算法开源实现的demo。


如果你已经按照我上面的建议,学习了上面相关的大部分内容,仍然遭到面试官的拒绝。建议你换个其他岗位,有可能面试官本身太水。


其实,「为什么学Java虚拟机」这个问题,就和「为什么要学习数据结构和演算法」是一个道理:工欲善其事,必先利其器。可以说,Java虚拟机就是每一位Java工程师进阶加薪的利器,你想往上升,你想深入技术,不想一直停留在简单开发,或者你在做Java性能分析、调优工作时,那么,Java虚拟机绝对是一把助力的利剑。面试风气简单的问题都不好意思问,怕面试者鄙视面试公司问的问题。现在有一股妖风,不管啥公司都慢慢像阿里这样的公司靠近,面试不问点jvm、并发、分散式都不好意(虽然公司可能没有用到,虽然可能仅仅CURD),老是觉得问问这些显得逼格高点,不管处于什么原因很多公司的确都在学习他们,都在问这些问题,那么我们就朝著这些大的方向努力也是没错的,如果朝著这些方向努力就是他们需要的人才,那么也就对了。类似其他,比如高并发 锁、分散式、缓存等都可以考虑考虑这样思考,你会有不一样的收获的。


这个不是几句话就能说清楚的,我建议看看深入理解JVM虚拟机,可以说为了面试而看,但是我认为这是搞java开发的基础,应该掌握的东西,希望对你有帮助


推荐阅读:
相关文章