转载

深入理解java虚拟机系列初篇(一):为什么要学习JVM?

前言

本来想着关于写JVM这个专栏,直接写知识点干货的,但是想着还是有必要开篇讲一下为什么要学习JVM,这样的话让一些学习者心里有点底的感觉比较好...

原因一:面试

不得不说,随着互联网门槛越来越高,JVM知识也是中高级程序员阶段必问的一个话题!现在不像以前了,以前会点 html 都好找工作,现在由于学习软件的人越来越多,而且每年大学生都在毕业(而老一辈的也很少换工作)人只会越来越多,随便在大街上拉一个头发茂盛的大叔都可能就是搞软件的,现在有一股妖风,不管啥公司都慢慢像阿里这样的大公司靠近,面试不问点jvm、并发、分布式都不好意思(虽然公司可能没有用到,虽然可能仅仅CURD),老是觉得问问这些显得逼格高点,不管处于什么原因很多公司的确都是这样的!

所以我不得不相信很多人一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮去学。所以很多人对于为什么要学虚拟机这个问题,一致的答案皆是:因为面试。

其实学习JVM并不仅仅在于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。其实说白了,还是得先 好(通)好(过)学(面)java(试)....

然而现实就是这样,毕竟现实源于生活!也正是因为生活学习JVM为了面试的同时也为今后更好的学习java打下了基础!

原因二:为了深入地理解 Java 这门语言

学习 Java 虚拟机能深入地理解 Java 这门语言。对于刚刚工作一两年的朋友来说,各个 API 都没用熟,自然不会去深入研究 Java 中的各种细节。如果你这辈子只甘心做一个平庸的Java码农,那么你完全没有必要去学习JVM相关的知识。

但对于工作了三年以后的朋友来说,很多时候你要解决一个问题必须深入到字节码层次去分析,你才能得到准确的结论,而字节码就是虚拟机的一部分。

深入地理解 Java 这门语言实例:

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

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

以上两个例子如果你不懂虚拟机的一些基础知识,那么你就很难深入理解一些细节。

不说别的,就光和同事聊天,同事说到什么新生代老年代问你一个GC日志排查,你没有JVM基础,贼尬,那个时候你就只会喊我C牛B....

原因三:学习虚拟机是为了今后更好的解决线上排查问题

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

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

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

学习JVM的好处

学习JVM对于一个Java程序员的好处大概可以概括为下六点:

1、能够明白为什么Java最早期被称为解释型语言,而后来为什么又被大家叫做解释与编译并存的语言(了解JVM中解释器以及即时编译器就可以回答这个问题); 2、你能够理解动态编译与静态编译的区别,以及动态编译相对于静态编译到底有什么好处(JVM JIT); 3、能够利用一些工具,jmap, jvisualvm, jstat, jconsole等工具可以辅助你观察Java应用在运行时堆的布局情况,由此你可以通过调整JVM相关参数提高Java应用的性能; 4、可以清楚知道Java程序是如何执行的; 5、可以明白为什么Java等高级语言具有可移植性强的特性。 其实这个问题相当于“为什么C/C++程序员需要学体系结构与编译原理?“ 6、能够知道你的头发是怎么没有的

关于我之后的JVM专栏

其实在开始写JVM专栏之前就很想写一个并发编程专栏了,想了很久,最后还是决定先写一个JVM专栏!学习JVM有一个最大的特点就是....学了就忘,嗯哼~

由于虚拟机种类繁多这里就不一一列举,最常用的就是 Hotspot虚拟机 (翻译过来就是 热 地点、斑点,理解为热点也行)以后该专栏都是以Hotspot虚拟机为准的文章。

如果想要更深入的理解JVM推荐看周志明老师的《深入理解Java虚拟机》。实战类型的,可以看葛一鸣老师的《实战Java虚拟机》

为了方便大家学习JVM,不用去网上找相关书籍,博主准备了周志明老师的《深入理解Java虚拟机》电子书,慢慢啃吧hhhhhhhh...

周志明老师的《深入理解Java虚拟机》: pan.baidu.com/s/1JoNm7LWK… 提取码:i3xz

以下是本JVM专栏的文章:

别翻了,这篇文章绝对让你深刻理解java类的加载机制【JVM篇二】

参考: 《深入理解Java虚拟机》

原文  https://juejin.im/post/5dcbb1e06fb9a04ab32031e3
正文到此结束
Loading...