Java虚拟机漫漫学习路,我终于悟了

毕业8年,前5年的职业规划是做计算广告,后来感觉计算广告这一行更注重的是业务而非技术,而自己的性格更适合做技术,所以毅然决然的辞职, 全职1年半时间写了2本关于Java前端编译器和Java虚拟机HotSpot的书,今年年初来到杭州做Java虚拟机开发相关的工作,也算是顺利切入Java虚拟机这一行了。

差不多从下决心研究Java虚拟机开始已经过去了3年多的时间,期间还研究了Java前端编译器,这一块也花费了我好多精力,着实有些不值,因为Java前端编译器相对虚拟机来说并不显的那么重要,而且目前也没有公司有Java前端编译器的开发需求。不过总归是有些作用的,一来我把这些知识写成了一本书《深入解析Java编译器:源码剖析与实例详解》,赚取了一些稿费;二来我也通过这本书得到了一些面试机会,不过最愿意给我提供岗位的就是一些做监控相关的公司,因为Java前端编译器和字节码息息相关,监控会涉及到对字节码的插桩,动态类加载等内容。不过实话实说,不如将研究Java前端编译器的时间和精力用来研究Java虚拟机,价值会更大一些。

全职写完2本书后,我对自己的职业规划是做一个技术点,也就是专攻Java虚拟机,并且现在已经切入到这个领域了,算是小有收获吧。现在研究HotSpot VM源码也快有3年了,大体对这个工程实现已经有了清晰的认识,对一些重要的实现细节还算比较了解。记得刚接触HotSpot VM时,还是通过百度网上各种资料入门的,但这些内容总归是错误不少,或者不成体系,所以我每遇到一些好的内容都会在通过自己的日志摘录下来,后面持续对这些日志进行分类整理,然后加上我的理解后不断加工,最后内化成自己的东西。日复一日的总结整理后,沉淀了400多篇日志,大概的分类如下:

其中编号为01到08这些分类下的内容已经整理完成并写成了书《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》,现在已经能在当当和京东上预购。剩下的编号从10到20的相关内容也会整理成书,书名为《深入剖析Java虚拟机:源码剖析与实例详解(运行时卷)》。

研究了这么久的Java虚拟机,我还是有所收获的,下面我就聊一下小伙伴们经常问到的问题。

1、为什么要学习Java虚拟机? 

为什么要学习Java虚拟机?简单来说,学习 Java 虚拟机可以让你知道Java 程序是如何被执行的,又如何被优化的。只有知道程序如何被执行和被优化才能编写出更高效的代码。总结一下, 学习Java 虚拟机有如下(但不限于)好处

(1)学习Java虚拟机让你更深入的了解虚拟机之上的语言的运行原理,如Scala、Java、Kotlin等。这样可以在面试的过程中增加不少自信,也会提高面试成功的概率;

(2)学习Java虚拟机可以让你更好的使用它。如Java 虚拟机提供了许多配置参数,我们可以针对不同的应用配置不同的参数来让程序的性能达到最优;

(3)Java 虚拟机本身是一种工程产品,实际的代码实现过程要比单纯的理论看着更复杂,需要考虑的情况更加复杂而全面,这反而能让我们对理论有个更深刻的理解,同时也能感受一下超大型项目的架构和设计理念;

(4)学习虚拟机可以更快、更准确的排查线上排查。假设线上遇到了服务超时的情况,我们排查后发现有FGC的发生,那么怎么去更准确的定位这个问题?首先,必须要看懂日志,要看懂日志,就要对Java虚拟机年轻代、老年代、永久代、元数据区等内容有所了解;其次还要知道各种GC算法的实现原理,了解他们的优缺点等,这些都是虚拟机实现的一部分。

对于我本人来说,我喜欢研究底层技术,之前在做Java应用开发的时候,总感觉Java虚拟机对我来说是个黑盒,我有强烈的欲望看看它是怎么实现的,同时也是想做一些看起来有逼格的事情,有技术门槛的事情,避免35岁中年危机。 

2、如何快速切入Java虚拟机领域?

我记得2年前开始研究Java虚拟机时,查遍了网上所有的资料,凡是能遇到一点好的关于Java虚拟机的资料,我都会认真读、一遍读不懂没关系,我都会搬到自己的日志中记录下来,后面就是对这些日志进行分类整理,然后加上我的理解后不断加工,最后内化成自己的东西。现在市面上系统介绍Java虚拟机的书籍非常少,细致全面的书籍更是市场空白,所以我把我这几年的所学写成了3本书,希望能更快帮助大家理解Java虚拟机。大家如果想要快速切入Java虚拟机领域,可以参考我的书籍《深入解析Java编译器:源码剖析与实例详解》和《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》,《深入剖析Java虚拟机:源码剖析与实例详解(运行时卷)》一书暂时还没有上市,不过运行时卷的相关内容已经在我的公众号“深入剖析Java虚拟机HotSpot”开始持续更新。

如果大家有兴趣学习Java虚拟机,可以按照如下的学习路线图来参考我对应的书籍。

左侧是Java底层的一些东西,而右侧的书籍详细介绍了左侧对应的内容,大家如果有兴趣可以买来阅读一下。

《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》当当现在打5折,估计是最便宜的时候了。

购买地址:http://product.dangdang.com/29291057.html

《深入解析Java编译器:源码剖析与实例详解》购买地址:https://item.jd.com/12794094.html

《深入剖析Java虚拟机:源码剖析与实例详解(运行时卷)》 相关内容在公众号 ”深入剖析Java虚拟机HotSpot“ 开始持续更新。

3、学习Java虚拟机有什么好的建议?

如果要学习Java虚拟机,首先要弄清楚自己的目地。比如有的人只是为了排查线上问题、有的人为了面试、有的人想将来想从事与虚拟机开发相关的工作。不同的目的需要对虚拟机的理解和掌握程度不同,如只是想从虚拟机级别排查线上问题,那就专注于研究和当前线上问题相关的Java虚拟机实现即可。

其次就是在学习的过程中,不要抱有速成的心态,这是有些人开始研究时的一种心态,就想着自己闭关3、5个月,全力将虚拟机研究明白,能这么短时间将虚拟机玩儿明白几乎是不可能的,即使你对虚拟机涉及到的一些技术有非常好的基础。对我来说,3年前开始研究时,只有Java基础和一些C的基础,其它就都没有了,虽然在大学学过编译原理、汇编语言,不过早就还给老师了。我在研究HotSpot VM之前恶补了很多的基础知识,看了很多的书、论文和博客,比如《C++ Primer》、《Linux系统编程》、《垃圾回收算法手册》、《x86汇编语言》、《Java虚拟机规范》、还有Intel开发者手册等等。所以说,如果你基础差一些,光补基础就不是3、5个月能完成的,我们还是要准备好5年、10年持续学习的打算吧。

之前遇到过很多小伙伴问我是怎么研究HotSpot VM的?HotSpot VM差不多有60万行左右的代码,但是我们并不需要研究每一行的实现,而且有些知识点能够触类旁通。下面我罗列了一下我的研究小技巧:

(1)只专注与Intel CPU下x86架构的、在Linux平台上的代码实现,其它架构和平台下的代码实现不去研究,我甚至把那些不需要研究的代码都删除了,为了让代码量变少一些,在研究的过程中能更好定位一些,少一些的代码也让我心理不那么悚;

(2)有些东西能够触类旁通,例如研究串行收集器Serial和Serial Old时,如果已经掌握了GC标记逻辑、代际引用、以及年轻代的垃圾收集算法、对象偏移表、卡表等知识点,那么在后续研究CMS、G1等垃圾收集器时会有相当大的帮助。所以我们在研究某个具体实现时,一定要专注于把其中涉及到的知识点彻底弄懂;

(3)前期不要过分纠结细节,否则会陷进细节的汪洋大海中,耗费精力不说,也容易打击自信心。所以要在掌握原理的基础上,对重点代码的实现进行剖析即可;

(4)在研究某段代码之前最好知道这段代码的作用,可以阅读注释、请教别人,这样能更快的理解代码的实现细节。例如要阅读一下解释执行相关的代码,那最起码需要阅读一下相关的论文和书籍关于解释执行的介绍,知道解释执行的基本实现原理;

(5)学习过程中要不断总结,一定要有产出。我会记录自己研究Java虚拟机某个知识点的详细过程,把不明白的记下来,标红。古人说的好,好记心不如烂笔头。好多东西在开始学习的时候可能只能懂的一些皮毛,我们只能Get到一些零散的知识点,后续还要3遍、5遍的去研究。对于我来说,每次研究都会有新的收获,而且如果解决了上次标红的问题,对我来说还有种小小的成就感。

如果大家想了解更多的虚拟机知识,或者想快速切入虚拟机这个领域,可以多去关注一下我写的书籍和文章,有问题还可以加我微信mazhimazh,我们有专门的虚拟机讨论组,大家一起学习,共同进步!

原文地址:https://www.cnblogs.com/mazhimazhi/p/15174921.html