跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看。所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试。但我经过了几年的学习和实战,我发现其实学习虚拟机并不仅仅在于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。

先聊聊我的第一个观点:学习 Java 虚拟机能深入地理解 Java 这门语言。对于刚刚工作一两年的朋友来说,各个 API 都没用熟,自然不会去深入研究 Java 中的各种细节。但对于工作了三年以后的朋友来说,很多时候你要解决一个问题必须深入到字节码层次去分析,你才能得到准确的结论,而字节码就是虚拟机的一部分。

例如我们常用的布尔型 Boolean,我们都知道它有两个值,true 和 false。但你们知道其实在运行时,Java 虚拟机是没有布尔型 Boolean 这种类型的。Boolean 型在虚拟机中使用整型的 1 和 0 表示。

例如我们都知道类路径和类名唯一确定一个类,但事实上并不是这样。或者说,我们前面说的结论只是表面上的。如果深入到虚拟机层面来说,类加载器、类路径、类名才唯一决定一个类。也就是说,如果两个不同的类加载器它们加载同一个 class 类文件,那这两个类加载器加载的类就是不同的。

类似这样的例子还有很多。学 Java 学到了这个程度,如果你不懂虚拟机的一些基础知识,那么你就很难深入理解一些细节。

接着我想聊聊我的第二个观点:学习虚拟机是为线上排查问题打下基础。我们知道我们一个 Java 应用部署在线上机器上,肯定时不时会出现问题。除去网络、系统本身问题,很多时候 Java 应用出现问题,就是 Java 虚拟机的内存出现了问题。要么是内存溢出了,要么是 GC 频繁导致响应慢等等。

那如何解决这些问题呢?首先,你必须学会看懂日志吧。那么你就必须要看得懂 GC 日志,这是 Java 虚拟机内容的一部分。你看懂了 GC 日志,那么你就得明白什么是年轻代、老年代、永久代、元数据区等,这些就是 Java 虚拟机的内存模型。你懂了 Java 虚拟机的内存模型,那你就得知道 Java 虚拟机是如何进行垃圾回收的,它们使用的垃圾回收算法是怎样的,它们有何优缺点。接下来就是各种垃圾回收器的特性。

你看,这一切东西都是相关联的。你想要解决线上的 Java 应用崩溃问题,那么你就必须学会 GC 日志。要看懂 GC 日志,就必须学习 Java 虚拟机内存模型。要看懂 Java 虚拟机内存模型,你就要学会垃圾回收机制等等。

说完了为什么要学虚拟机,接下来我想说一下我为什么要写这个专栏。

或许在别人看来,市面上的虚拟机资料已经非常丰富了。理论类型的,可以看周志明老师的《深入理解Java虚拟机》。实战类型的,可以看葛一鸣老师的《实战Java虚拟机》。我似乎没有理由再去写同样的内容,写了也会有大部分内容的重合。一开始我也是这么想,但后来我发现在某些知识点的理解上,我有我自己的理解,我希望与大家分享。虽然不可避免会有一些重叠的地方,但写作思路不一样,针对的人群不一样,意义自然也就不一样了。

比起《深入理解Java虚拟机》和《实战Java虚拟机》,我写得应该更浅显一些,更容易看得懂一些。这个专栏会以一条逻辑线索方式去写,即以源代码、字节码、机器码、加载到内存、垃圾回收这个视角去写,聊聊这中间所涉及到的所有知识点。这种方式相对来说更有逻辑性,更能把所有知识点都串联起来。希望以一种有逻辑的方式去将所有知识点串起来,让大家更好理解,能让初学者不仅知道这个东西,还知道为什么要这么做。

确定想做这件事情之后,我 2 个月前开始准备,每天早上 6 点起床看相关书籍,开始着手写初稿。但要写好一个深入浅出的专栏真的不容易,有时候要求太高反而容易让文章难产而死。在我写下这篇文章之时,我大致已经理清楚要写的文章章节,但是内容还是无法非常明确。但我知道,如果我再不发出来,或许就再也不会发出来了。因为写得时间太久了,太拖下去或许就写不完了。有时候太追求完美,反而不是一件好事。所以大家在看的时候欢迎多提提意见,帮助我完善文章。

如果你对我说的感兴趣,那可以关注一下我后续发的文章。如果你有朋友也对 Java 虚拟机感兴趣,也可以转发给他们,邀请他们一起拉学习。

本文完。


未来一段时间里,我都专注于 Java 虚拟机方面的专题学习。于是我建了一个交流群,专门讨论学习 Java 虚拟机方面的内容,每周讨论一个知识点。如果你有兴趣,可以关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友,之后回复「虚拟机交流」入群

JVM基础系列文章目录

JVM基础系列开篇:为什么要学虚拟机?的更多相关文章

  1. JVM基础系列第6讲:Java 虚拟机内存结构

    看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了.那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了.在这个过程中,J ...

  2. JVM基础系列第3讲:到底什么是虚拟机?

    我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的.类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 ...

  3. JVM基础系列第2讲:Java 虚拟机的历史

    说起 Java 虚拟机,许多人就会将其与 HotSpot 虚拟机等同看待.但实际上 Java 虚拟机除了 HotSpot 之外,还有 Sun Classic VM.Exact VM.BEA JRock ...

  4. JVM基础系列第15讲:JDK性能监控命令

    查看虚拟机进程:jps 命令 jps 命令可以列出所有的 Java 进程.如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示. $ jps 6540 ...

  5. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  6. JVM基础系列第13讲:JVM参数之追踪类信息

    我们都知道 JVM 在启动的时候会去加载类信息,那么我们怎么得知他加载了哪些类,又卸载了哪些类呢?我们这一节就来介绍四个 JVM 参数,使用它们我们就可以清晰地知道 JVM 的类加载信息. 为了方便演 ...

  7. JVM基础系列第11讲:JVM参数之堆栈空间配置

    JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError.因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要. tips ...

  8. JVM基础系列第10讲:垃圾回收的几种类型

    我们经常会听到许多垃圾回收的术语,例如:Minor GC.Major GC.Young GC.Old GC.Full GC.Stop-The-World 等.但这些 GC 术语到底指的是什么,它们之间 ...

  9. JVM基础系列第9讲:JVM垃圾回收器

    前面文章中,我们介绍了 Java 虚拟机的内存结构,Java 虚拟机的垃圾回收机制,那么这篇文章我们说说具体执行垃圾回收的垃圾回收器. 总的来说,Java 虚拟机的垃圾回收器可以分为四大类别:串行回收 ...

随机推荐

  1. with原理__enter__、__exit__

    Python对with的处理还很聪明.基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法. 紧跟with后面的语句被求值后,返回对象的__enter__( ...

  2. LOJ#3043.【ZJOI2019】 线段树 线段树,概率期望

    原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day1T2.html 前言 在LOJ交了一下我的代码,发现它比选手机快将近 4 倍. 题解 对于线段树上每一个节 ...

  3. SSM项目目录结构

  4. myBase Desktop 6.5.1 无限期试用

    清空安装目录下的"nyfedit.ini"文件的"App.UserLic.FirstUseOn="配置项的值

  5. 奖品列表组件【仿swiper】

    最近lz在做项目的一些优化,发现我的项目里有个奖品列表的功能:我们之前是引入swiper这个库去做的:swiper库的滑动效果确实比较好看,但是js文件以及css文件相对是比较大的:考虑到这个小小的需 ...

  6. kaggle之泰坦尼克号乘客死亡预测

    目录 前言 相关性分析 数据 数据特点 相关性分析 数据预处理 预测模型 Logistic回归训练模型 模型优化 前言 一般接触kaggle的入门题,已知部分乘客的年龄性别船舱等信息,预测其存活情况, ...

  7. 我的 FPGA 学习历程(12)—— 电子钟项目准备

    初学 FPGA 的时候,我们总是存在很多疑问,比如:xilinx 和 altera 的 FPGA 那种比较好.verilog 语言被如何综合成具体硬件电路.RTL 级电路是什么意思等等.现在我们就不会 ...

  8. centos 桥接配置 设置网络代理 lnmp搭建

    一.桥接配置 centos设置  编辑->虚拟网络编辑器->桥接模式->还原默认设置 虚拟机->设置->网络适配器->桥接 cd /etc/sysconfig/ne ...

  9. 你不知道的JS之 this 和对象原型(一)this 是什么

     原文:你不知道的js系列 JavaScript 的 this 机制并没有那么复杂 为什么会有 this? 在如何使用 this 之前,我们要搞清楚一个问题,为什么要使用 this. 下面的代码尝试去 ...

  10. 封装一个 员工类 使用preparedStatement 查询数据 (1)

    创建员工类  自动生成get set 方法 package cn.hph; public class emp { //定义表中的属性 private int id; private String en ...