

深入理解java虚拟机系列初篇(一):为什么要学习JVM?
source link: http://www.cnblogs.com/yichunguo/p/11849922.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言
本来想着关于写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虚拟机》: https://pan.baidu.com/s/1JoNm7LWKJNyF6bGX3j6MuQ
提取码:i3xz
以下是本JVM专栏的文章:
别翻了,这篇文章绝对让你深刻理解java类的加载机制【JVM篇二】
尽量抽空更新...
再次提醒:学习JVM有一个最大的特点就是....学了就忘,嗯哼~
最后,欢迎各位关注我的公众号,一起探讨技术,向往技术,追求技术...

参考:
《深入理解Java虚拟机》
https://www.cnblogs.com/chanshuyi/p/jvm_serial_00_why_learn_jvm.htmlRecommend
-
20
一 前言 Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目标,大...
-
24
据悉,红帽认证将于本年的8月份更换Rhel7为Rhel8。所以我想趁这次机会搏一搏。 我个人是初中就神仰Linux已久,只不过那个时候的我只知道Linux系统,不知道有什么区分。奈何那时的我希望在安装成功Linux系统后在学习Linux的相关知...
-
39
本文源码: GitHub·点这里 || GitEE·点这里 一、虚拟机简介 1、虚拟机概念...
-
34
一、类加载简介 类的加载机制是指把编译后的.class类文件的二进制数据读取到内存中,并为之创建一个java.lang.Class对象,用来封装类在元数据空间的数据结构。
-
12
靶机系列小讲(1)对手决定了你的水平:靶机的概念及作用 来源:科普中国-军事科技前沿2021-01-25 10:58...
-
9
靶机系列小讲(2):靶机也要“私人订制” 来源:科普中国-军事科技前沿2021-01-25 10:58 ...
-
9
靶机系列小讲(4)五代机上场:靶机也要更快、更高、更强 来源:科普中国-军事科技前沿2021-02-02 10:38...
-
8
支持向量机系列五:Numerical Optimization 关键词:Numerical Optimization;
-
6
“支持向量机系列” 的番外篇一: Duality 关键词:Duality; 支持向量机;
-
11
聊聊 Sharding-Jdbc 的简单原理初篇 发表于 2021-12-26 分类于 Java 阅读次数: 7 阅读次数: 9 Disqus:
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK