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

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

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

其中编号为01到08这些分类下的内容已经整理完成并写成了书《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》,现在已经能在当当和京东上预购。剩下的编号从10到20的相关内容也会整理成书,书名为《深入剖析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编译器:源码剖析与实例详解》购买地址:https://item.jd.com/12794094.html

《深入剖析Java虚拟机:源码剖析与实例详解(基础卷)》预购地址:https://item.jd.com/12926187.html

《深入剖析Java虚拟机:源码剖析与实例详解(运行时卷)》 相关内容在公众号 ”深入剖析Java虚拟机HotSpot“ 开始持续更新,公众号目前更新到了第8篇,如下:

有兴趣可以关注我的公众号。

3、给想学习Java虚拟机的人的一些建议

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

其次就是在学习的过程中,不要抱有速成的心态,这是好多人开始研究时的一种心态,就想着自己闭关3个月、5个月的下决心把它研究个透彻,这几乎是不可能的,除非你对虚拟机涉及到的一些技术有非常好的基础,否则3、5个月很难玩明白虚拟机。拿我来说,只有Java基础,有一些C的基础,其它就都没有了,我在研究虚拟机之前补了很多的基础知识,看了很多的书,比如C++、Linux系统编程、垃圾回收算法手册、x86汇编语言、甚至是Intel的CPU机器指令手册这些东西,另外还要加上相关的论文。所以说,如果你基础差一些,光补基础就不是3个月、5个月能完成的,我们还是要准备好5年、10年的学习打算吧。

之前也是遇到很多人问我是怎么研究HotSpot VM的?我采取的是笨办法,硬着头皮去啃,这个东西感觉没有太多捷径,但没有捷径并不意味着在学习的过程中没有技巧和学习方法。HotSpot VM差不多有60万行左右的代码,但是我们并不需要研究每一行的实现,而且有些知识点能够触类旁通,下面我总结了一些我的研究心得:

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

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

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

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

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

现在各个行业内卷严重,但我拒绝躺平,如果有志,大家一起研究Java虚拟机,我拉你入讨论组,我的微信号mazhimazh。

Java虚拟机漫漫学习路,我终于悟了的更多相关文章

  1. java虚拟机的学习书籍推荐

    javaEE开发已然是一个老生常谈的话题了,但经典之所以会成为经典,就是因为有可重复琢磨之处,每一次的反复推敲都会有不一样的收获.如果你不满足于做一个只会写if…else…的Java程序员,而是希望更 ...

  2. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  3. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  4. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  5. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

  6. Java虚拟机JVM学习03 连接过程:验证、准备、解析

    Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...

  7. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  8. Java虚拟机JVM学习01 流程概述

    Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...

  9. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

随机推荐

  1. shell下读取文件数据

    参考:https://www.imzcy.cn/1553.html while和for对文件的读取是有区别的: 1. for对文件的读是按字符串的方式进行的,遇到空格什么后,再读取的数据就会换行显示 ...

  2. pdfkit html转pdf

    pdfkit的通用option选项 参考:https://cloud.tencent.com/developer/ask/202116https://www.cnblogs.com/taceywong ...

  3. python 两种排序方法 sort() sorted()

    python中有两种排序方法,list内置sort()方法或者python内置的全局sorted()方法 区别为: sort()方法对list排序会修改list本身,不会返回新list.sort()只 ...

  4. 玩Aarch64最方便的方法

    译至:http://d.hatena.ne.jp/embedded/20140819/p1 虽然Aarch64(ARM64)的板子还很难到手.但通过使用qemu就能执行Aarch64的用户空间程序.利 ...

  5. bugku Crypto 下半部分wp

    1. 百度托马斯这个人居然还发明了一种轮转的加密法,发现原理是,他将很多行乱序的26个字母,插到一根柱子上,参考糖葫芦的样子,可以旋转每一行,设置自己要发送的明文后,向对方发送乱码的一列,对方只要将这 ...

  6. hugo + nginx 搭建博客记录

    作为一个萌新Gopher,经常逛网站能看到那种极简的博客,引入眼帘的不是花里胡哨的图片和样式,而是黑白搭配,简简单单的文章标题,这种风格很吸引我.正好看到煎鱼佬也在用这种风格的博客,于是卸载了我的wo ...

  7. Log4.net示例

    //先用Nuget安装最新Log4net using System; using System.IO; using log4net; using log4net.Config; using log4n ...

  8. 备战-Java 基础

    备战-Java 基础 仰天大笑出门去,我辈岂是蓬蒿人. 简介:备战-Java 基础. 一.基本数据类型 1.Java基本数据类型 基本数据类型有8种:byte.short.int.long.float ...

  9. C++11 左值引用和右值引用与引用折叠和完美转发

    1.左值与右值 最感性的认识. 当然,左值也是可以在右边的. 左值是可以被修改的,右值不能. 当然取地址也是. 生存周期一般左值会比右值的长,一般右值都计算时产生的无名临时对象,存在时间比较短. 下面 ...

  10. lucene Hello World

    一个lucene创建索引和查找索引的样例: 创建索引: public class Indexer { private IndexWriter indexWriter; /** * 构造器实例化inde ...