提到JVM虚拟机该如何运作?
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。
如果你已经按照我上面的建议,学习了上面相关的大部分内容,仍然遭到面试官的拒绝。建议你换个其他岗位,有可能面试官本身太水。