JVM系列开篇:为什么要学虚拟机?

跟许多人一样,我一开始接触 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 虚拟机感兴趣,也可以转发给他们,邀请他们一起拉学习。

本文完

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

学习C语言你所必须要了解的知识

C 语言的发展方向 ? 20世纪80年代初,C 在 UNIX系统的小型机世界中已经是主导语言了,从那时开始,它已经扩展到个人计算机和大型机, 大部分软件开发商公...

39980
来自专栏北京马哥教育

Python是什么?点进来

Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言...

417110
来自专栏JavaEdge

设计模式实战 - 建造者模式

10230
来自专栏web前端教室

WEB前端架构(四)

今天是第三天,把购物车的基本功能算是都写完了。 这东西吧,思路想清楚之后,其实不难实现。 就是里面的逻辑交互很多,来来回回的,神烦啊,, 每一步每个操作都是对数...

24290
来自专栏Crossin的编程教室

【Python 第41课】 用文件保存游戏(3)

你的小游戏现在已经可以保存成绩了,但只有一组成绩,不管谁来玩,都会算在里面。所以今天我还要加上一个更多的功能:存储多组成绩。玩家需要做的就是,在游戏开始前,输入...

26640
来自专栏程序人生 阅读快乐

Linux Shell编程与编辑器使用详解

本书由浅入深,全面、系统地介绍了Linux技术,书中提供了大量实例,供读者实战演练。另外,本书有很多关于Linux下的命令操作内容,所以对于每个命令、每个管理设...

12210
来自专栏技术博客

VS2013中Python学习笔记[环境搭建]

Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

16720
来自专栏程序人生

软件随想录:代码与数据

在程序的世界里,代码和数据犹如一对孪生兄弟,你中有我,我中有你,有时候不大分得清楚。如果你研究过 linux 的 ELF(Executable and Link...

362110
来自专栏ytkah

finecms在任意页面调用栏目名称和地址等

  finecms如何调用栏目名称和地址呢?在任意页面。我们有时需要在不同的页面调用某个栏目名,怎么调用比较快呢?ytkah整理了一些快速调用语句方便查找 栏目...

34240
来自专栏梧雨北辰的开发录

Python学习(1):入门与导学一、了解Python二、Python能做些什么三、Pthon特点四、Python的缺点五、Python之禅六、Python学习的相关资料

20460

扫码关注云+社区

领取腾讯云代金券