28

JVM 史上最佳入门指南

 4 years ago
source link: https://mp.weixin.qq.com/s/r24cMUEjWTclIy-TQe9PMw?amp%3Butm_medium=referral
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.

本文转载自公众号:王磊的博客

提到Java虚拟机(JVM),可能大部分人的第一印象是“难”,但当让我们真正走入“JVM世界”的时候,会发现其实问题并不像我们想象中的那么复杂。唯一真正令我们恐惧的,其实是恐惧本身。而作为整个JVM系列的首篇,本文将带你解除刚开始学习JVM时的种种疑惑。比如:什么是JVM?为什么学习JVM?怎么有效的学习JVM?带着以上的这些问题,让我们一起走入JVM的世界吧。

一、什么是JVM?

JVM简介:JVM是Java Virtual Machine的缩写,中文翻译为Java虚拟机,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。简单来说JVM是用来解析和运行Java程序的。

Java有一个非常重要的特点“平台的无关性”,就是使用JVM实现的。Java语言只需要生成Jvm上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,因为JVM本身屏蔽了与具体平台相关的信息,使得Java能够“一次编译,到处运行”。

二、为什么要学习JVM?

学习JVM无外乎以下几个原因:

1、 程序调优

不同的程序(业务场景)需要不同的Jvm配置,比如设置不同的垃圾收集器、设置新生代和老生带的内存配置和占比等,不同的配置对于程序的运行有着千差万别的影响。而Jvm默认的配置只能保证程序能够“运行”,而想要“很好的运行”甚至是“更好的运行”,就是学习Jvm最主要的因素之一。

2、 排查程序运行问题

有些程序可能在线上使用的时候会遇到各种各样的问题,而这些问题通常都是致命的,比如内存溢出,死锁导致的程序运行缓慢等,而这些问题在开发和小量并发测试阶段是很容易被忽略的缺陷,所以学习好了Jvm才能在关键的时候,临危不乱帮你扫除系统中的“顽疾”。

3、 掌握了程序执行的根本和原理

也就是很多人说的:不但要“知其然”,还要“知其所以然”。

4、 规避写代码时候的一些错误

比如避免重载可变长参数的调用(后面文章会给出具体的案例)。

5、 应付面试

不得不说这也是很多人学习的目的之一,当然这也是积极的推动力,如果你明白“鲶鱼效应”的话。

6、 掌握了其他语言的通用机制

JVM还有一个强大之处是,它不止可以运行Java程序,还可以运行Scala、Clojure、Groovy,以及时下热门的 Kotlin,学习JVM便可以了解这些语言的通用机制,甚至于让这些语言共享生态系统。

三、怎么有效的学习JVM?

以上了解了学习JVM的种种好处,但是怎么有效的学习JVM呢?有人可能一看到“JVM”或者“Java虚拟机”这几个字就懵了,不知道它是啥,更别说要怎么学了。而本小节就是要教大家怎么有效的学JVM,把JVM做一个知识点的划分。可以说,掌握了以下列举的知识点,就是掌握了整个JVM。

JVM的知识点,分为如下几个:

1、 JVM的组成

只有了解了JVM的组成部分,才能算的上真正的了解了JVM,JVM的组成5个部分:堆、虚拟机栈、本地方法栈、程序计数器、方法区,后面文章会分别介绍5个部分的具体用途。

2、 多种垃圾回收算法

Jvm中有很多垃圾回收算法,不同的算法优缺点也各不相同,比如:标记清除算法和复制算法、标记清楚算法会产生多种空间碎片、复制算法把内存分为两块,性能虽然很好但是每次只能使用一块,又浪费了内存的空间,那有没有相对完美的算法呢?答案肯定是有的,由于篇幅的原因,后面文章会详细讲解。

3、 多种垃圾收集器

Jvm的垃圾收集器有很多,比如最早版本的串行收集器Serial,发展历史最悠久的收集器,它是采用复制算法的新生代收集器,它是一个单线程收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(“Stop The World”)。还有CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器;还有比较前沿的G1(Garbage-First)收集器等。

学习这些收集器,一方面是为自己程序配置合适的收集器,另一方面是每个收集器的设置参数都不相同,学习了这些收集器的配置之后,可以为程序设置最优的运行匹配参数。

4、 JVM分析工具

Jvm的分析工具用于排查程序运行的缺陷,找出程序的问题所在,从而保证程序的稳定运行,Jvm分析器分为:命令行工具(官方称之为实验性质的工具,但稳定性是不容置疑的),还有视图分析工具,前者当然优于后者,但后者是建立在前者的基础上的,本系列后面会详细的把每个工具进行深入的讲解。

5、 Java类加载机制

Java类加载机制,讲的是Java的类在Jvm中的加载以及运行机制,对于认识Java是怎么运行的有着非常大的帮助,这也是学习Java非常有趣的一点,你可以看到Java运行的整个过程,是完全透明化的,给人一种“掌控感”,这是Java语言天生支持的,所以会觉得Java这门语言很有趣。

6、 JVM常用优化配置

学习Jvm收益最大的其实就是,使用Jvm的这些常用配置,让你的程序运行的更高效,所以对于这方面的学习是必不可少的。

四、总结

本文带领大家对Jvm整体的印象有了初步的认识,我们明白了Jvm的学习能带给我们的收益,以及Jvm该如何学习,而这些问题恰好是刚开始学习Jvm 时最大的障碍。万事开头难,好的开始是成功的一半,恭喜你学习了Java领域中一项不可或缺的技能,如果觉得本文不错,欢迎转发到朋友圈或分享给你的朋友。

一份Java程序员必备《Java面试进阶指南》涵盖 面试必知、Java高频面试题+重要知识点总结、面试资源等内容。扫描下方二维码了解:

rIJFRbr.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK