一文告诉你,为什么要研究JVM原理
举一个例子,一个车间流水线工人知道怎么把汽车的每一个零部件放在什么位置,从而能够把一个完整的汽车拼装起来,并且能跑起来,但是汽车坏了装配工人不会修啊,不要紧,有专门的维修技术人员!所以就诞生了汽车维修工这个职业;相比之下,程序员们有好多现成的API可用、清晰业务逻辑、知道哪块代码放在什么位置合适,所以他们写出了业务代码。但是一旦他们的代码上线以后出了问题,是没人给他们维修的。你听说过代码维修人员吗?肯定没有,有人说运维,但是运维只是把问题收集了以后,不还得反馈给开发来解决。所以程序员不仅要会写,还要懂得代码的具体的运行机制和原理。要不然会死的很惨。
简单就是复杂,复杂就是简单。任何的一个高级语言,其底层无一例外的都是经过各种解码,各种封装,转换成计算机cpu能执行的机器指令。 就像Java一样,我们写的Java代码JVM认识吗?不认识! 这时候还需要给虚拟机配备一下翻译:类加载器,底层通过类加载器翻译成字节码文件,这样JVM就能认识了。JVM其实就是一个运行的环境,它负责将字节码文件按照顺序放到cpu的高速缓存中,然后cpu按照顺序进行执行。
JVM作为一款虚拟机,本身便是技术之集大成者,里面包含方方面面的底层技术知识。抛开如今Java如日中天之态势不说,纯粹从技术层面看,JVM也值得广大技术爱好者深入研究。可以说,从最新的硬件特性,到最新的软件技术,只要技术被证明是成熟的,都会在JVM里面见到其踪影。JDK的每一次更新,从内部到核心类库,JVM都会及时引入这些最新的技术或者算法,这便是技术传承意义之所在。随着云计算、大数据、人工智能等最新技术的发展,Java技术生态圈也日益庞大,JVM与底层平台以及与其他编程语言和技术的交互、交织日益深入,这些都离不开对JVM内部机制的深入理解。如果说以前在中间件与框架领域的大展身手,依靠的是Java语言层面的特性和技术,那么以后越来越多的技术红利将会因JVM层面之创新而得以显现。
被真相所蒙蔽,是一件痛苦的事。我们在一个被层层封装的世界里进行开发和设计,操作系统、各种中间件与框架,将底层世界隐藏得结结实实。我们一方面享受着高级编程语言所带来的高效、稳定、快速的开发体验,然而另一方面,却又如同行走于黑暗之中。我们不知道路的下面是否有坑,即使有坑,可能也不知道如何排除。Java的很多概念和技术,很多时候由于我们对底层机制的不了解,而让我们感到十分高深莫测,无法知其全貌。这种感觉非常痛苦,尤其是技术修炼到一定阶段的时候。纸上得来终觉浅,绝知此事要躬行。即使从Java语言层面下探到JVM层面,但是若只囿于对JVM机制理论和概念上的理解,很多时候仍然觉得缺乏那种大彻大悟之感。计算机作为一门科学,与其他的科学领域一样,不仅需要对其理论的理解,也需要能够去实证。例如爱因斯坦的相对论十分高深,但是通过对引力波和红移的观测,其变得形象和生动起来。Java的部分概念经过“口口相传”,似有过于夸大其技术神秘性之嫌,让人望而生畏。例如,与volatile关键字相关的内存可见性、指令乱序等概念,给人无比博大深奥的印象,但是如能抛开概念,直接看底层实现机制,并辅以具体的实验论证,则会形成深刻而彻底的认知。
其实,这世界本来就很简单。在可观测的实验结果与可理解的底层机制面前,一切浮夸的概念都自然会现出原形。因此,采用自底而上的技术研究之道,相比自顶而下的办法,便多了更多窥透本质的自信和平实。同一个底层概念,在不同的高级编程语言里,在概念、叫法上很少能够保持一致。采用自底而上的探索方法,能够揭开各种深奥概念的神秘面纱,还原一个清明简洁的世界。自然理解曲线也不会有大起大落。研究JVM的过程,就是与大师们进行精神沟通和心灵交流的过程,虽然过程会比较痛苦。研究诸如Linux、JVM这样的底层程序,你能学习到大师级的理念,更能够见识到经无数牛人反复锤炼后的技术。天长日久的耳濡目染,终有一天你也会成为大师,你也会拥有大师级的眼光,你也会拥有开阔的胸怀。如同音乐家李健,人们如此喜欢他,并不仅仅是因为他歌唱得好,更多的是因为气质。而这种气质来自于博览群书,来自于对艺术的长久修炼。计算机从某种程度上而言,也是一门艺术,工程师和程序员们要想进化,对计算机艺术的修炼必不可少。与大师进行精神沟通,不仅能够修炼到计算机的艺术,更能直接感受并养成大师身上所具备的气质。
我们不知道Java还能走多远,未来是否会被淘汰,但你不能因此就否定研究JVM的意义。JVM作为一款虚拟机,各种底层技术和理论都有涉及,若你能研究透彻,则能一通百通。其实大部分语言,诸如Python、JavaScript等高级面向对象语言虚拟机的机制,发现它们内部的整体思路都相差不大。同时,JVM本身在运行期干了一部分C或C++语言编译器所干的事,例如符号解析、链接、面向对象机制的实现等,通过对这些机制的分析,从来没有研究过C/C++编译器原理的我,基本也能够猜出C/C++编译器可能的实现方式,后来翻阅了相关资料,果不其然。理解编译与虚拟机的实现机制是一方面,另一方面,通过深挖JDK核心类库的内部实现,则能够深刻理解线程、并发、I/O等比较高深的技术内幕。例如Java NIO,何谓VMA?何谓内核映射?若想真正彻底理解这些概念,不从底层入手,恐怕很难有一个具象化的认知。
总之,研究JVM,是一件非常能够提升开发者内功的事情,未来无论出现什么样的新语言、新技术、新概念,你总是能够不被表面的东西所迷惑,而是能够透过层层封装,看清事物的本质,你总是能够以极低的学习成本,迅速理解新的东西。从一个更为广阔的视角,使用发散的思维去看,不一定非要研究JVM才能有很大收获,研究其他技术的底层,会有异曲同工之妙。而我只不过恰好生在了这个年代,这个Java语言大行其道的年代,所以就恰好对其做了一个比较深入的研究而已。工具有时空疆界,而技术思想则没有,其总能穿越千万年的时空,无限延伸。
没有付出就没有收获,你还想一直做一个CRUD工程师吗? 赶紧行动起来,发掘一下自己的潜力吧!
喜欢就关注一下哦!