Java虚拟机漫漫学习路,我终于悟了
毕业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虚拟机漫漫学习路,我终于悟了的更多相关文章
- java虚拟机的学习书籍推荐
javaEE开发已然是一个老生常谈的话题了,但经典之所以会成为经典,就是因为有可重复琢磨之处,每一次的反复推敲都会有不一样的收获.如果你不满足于做一个只会写if…else…的Java程序员,而是希望更 ...
- Java虚拟机JVM学习07 类的卸载机制
Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- Java虚拟机JVM学习05 类加载器的父委托机制
Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...
- Java虚拟机JVM学习04 类的初始化
Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...
- Java虚拟机JVM学习03 连接过程:验证、准备、解析
Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...
- Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
- Java虚拟机JVM学习01 流程概述
Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
随机推荐
- Anaconda软件安装使用问题
目录 更新源 用conda安装包出现的环境不一致问题 更新源 命令行 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...
- Java | 变量 & 常量
变量 Java是一种强类型语言,每个变量都必须声明其数据类型,变量本质上就是代表一个"可操作的存储的空间",在定义之后空间位置是确定的,但是里面放置什么值是不确定的,我们操作的时候 ...
- 入门Kubernetes-Service
一.前言 前一篇文章通过 Deployment 实现了Pod中服务实现滚动更新/回滚等操作:在真实应用场景中,需要将一组Pod提供给外部访问.而且Pod生命周期是短暂的,在 Pod 的生命周期过程中, ...
- Django基础-001
一.开发模式 MVC模式: model:数据库 view:前端展示 controller:逻辑控制MTV模式 model:数据库 view:逻辑控制 template:前端展示 二.Django介绍 ...
- C语言:渔夫打鱼晒网问题
//如果一个渔夫从 2011 年 1 月 1 日开始三天打渔,两天晒网,编程实现当输入 2011 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网. #include <stdio.h ...
- springMVC-3-获取参数
RequestMapping修饰类 源码: 根据源码可以知道,requestmapping既可以修饰方法也可以修饰类 @Target({ElementType.METHOD, ElementType. ...
- 每天五分钟Go - 常量
常量的声明 常量使用const进行对不会被改变值的修饰符 const 常量名 [常量类型] = 常量值,和变量的声名一样可以省略类型 const a=1 const b="a" c ...
- 关于GPIO口的一些概念性问题
一.什么是GPIO? GPIO的英文全称是General-Purpose IO ports,也就是通用输入输出口. 在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CP ...
- Idea快捷键 累积大全
分类 Editing 这个 Searching/Replcae Navigation Atl +1 打开和关闭左侧p ...
- synchronized 加锁 this 和 class 的区别!
synchronized 是 Java 语言中处理并发问题的一种常用手段,它也被我们亲切的称之为"Java 内置锁",由此可见其地位之高.然而 synchronized 却有着多种 ...