我要写整个中文互联网界最牛逼的JVM系列教程 | 内存与垃圾回收篇概述
Posted 李阿昀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我要写整个中文互联网界最牛逼的JVM系列教程 | 内存与垃圾回收篇概述相关的知识,希望对你有一定的参考价值。
前言
不错,正是在下,我就是你们亲爱的李阿昀,我李阿昀今天又开了一个坑,这个坑便是从现在开始以极其认真以至到变态的程度写出一份整个中文互联网界最牛逼的JVM系列教程,没有之一,注意,是没有之一哟!只要这套教程能面世,那必将是惊天地泣鬼神之举,秒所有有关JVM系列文章不在话下,因为这套教程将涵盖JVM的方方面面,一点细枝末节我也不会放过!
所以,对于我来说,要想完整写完这套JVM系列教程,势必会花费我巨大的精力和心血,须知写作的这一过程是非常痛苦的,似乎可以令人痛不欲生。我想这一套JVM系列教程写完,最最最保守估计能写出上百篇文章,注意,这可不是小打小闹的一两百篇文章哟,大家可千万不要低估了这套JVM系列教程的份量,这也足见我对JVM这门技术是怀有着多么谦虚与诚恳的态度,希望大家也能如我一样对技术有着一颗虔诚的心!
由于这套JVM系列教程所包含的篇幅是如此之长,所以我会持续不断地来更新,更新的速度可能会很慢,因为每更新一篇文章,都要耗费我巨量的精力和心血,说是呕心沥血也不为过,这就像仓颉造字一样,从无到有地来创建出一套完备的文字,稍微一想,都知道这有多难,当然了,我自比仓颉,多少有点狂妄了,但是是这个理啊!如要是真能看到这套JVM系列教程完整面世,那大家必将是会大大大大饱眼福!
最后,希望大家踊跃订阅这一专栏,随时关注专栏动态,嘻嘻😊,这是我的一点小心思,希望大家不要见怪!
内存与垃圾回收篇概述
关于JVM,相信对于所有做过Java开发的人来说,应该是非常熟悉的了,乃至没做过Java开发的人也是对JVM早有耳闻,这是因为很多其他的语言都跟JVM有着千丝万缕的关系,这一点在后续的讲解过程中相信大家应该会深有体会!
看到这里,可能有童鞋会问,你写的这套JVM系列教程主要涉及到了哪些内容呢?我就知道大家心里会有这个疑惑,所以接下来我会给大家进行一番详细介绍。
关于这套JVM系列教程,我整体上是分成了四个篇章,它们分别是:
- 内存与垃圾回收篇
- 字节码与类的加载篇
- 性能监控与调优篇
- 大厂面试篇
其实,通过前三个篇章的讲述,基本上就能把JVM所囊括的内容全都介绍到了,然后在第四个篇章,我会给大家再介绍一些有关JVM大厂方面的面试题,让大家提前一只脚踏进大厂的门槛,这样,以上这套JVM系列教程所囊括的内容就算比较完整了!嘿嘿😊,不是我王婆卖瓜自卖自夸啊,我就问你你能在市面上找到这样完备的JVM系列教程吗?找不到,你还不快快来订阅我这份专栏!
做过Java开发的童鞋,其实你心里应该要很清楚地知道一点,就是你总会直接或者间接地使用到JVM。而对JVM不熟悉的童鞋,一旦要使用到JVM,心里就会发怵,这时解决途径无非就两条,一是在网上查阅有关JVM的文章,一是直接买一些讲述JVM有关的书籍,如果你要是买了几本讲述JVM有关的书籍的话,那么随手翻开一本来看,相信它里面应该都会囊括以上这套JVM系列教程中某些篇章的内容,例如内存与垃圾回收,可以说讲述JVM有关的书籍通常上来都会先讲这部分的内容,因为它算是JVM中最基本的内容了。
一般来说,那些讲述JVM有关的书籍普遍都会囊括以上这套JVM系列教程中内存与垃圾回收、字节码与类的加载这两个篇章的内容,当然,也有专门的书是来侧重于第二个篇章或者第三个篇章的内容的,不过整体来看,国内目前可供参考的JVM书籍其实不算多。至于网上的教程的话,其实大家去网上搜索一下你便会发现搜索出来的文章是很有限的,而且文章质量良莠不齐,普遍都比较晦涩难懂,看完你都不知道它在讲什么,属于是越学越糊涂。
所以,基于此,我就在一些讲述JVM有关的书籍与视频的基础之上,耗费巨量的精力和心血整理出了这套JVM系列教程,为的就是拨开云雾见青天,足够通俗易懂的来为大家讲述JVM,如果看了我这套JVM系列教程,大家能对JVM有很深刻的理解,那么我就可以含泪而笑了。
大家从上面也看到了,这套JVM系列教程开篇介绍的就是内存与垃圾回收这一篇章的内容,那我们肯定是要从这一篇章开始学起的,这是毋庸置疑的。不过,这里我想重点强调的一点就是,在讲解这一篇章内容的过程当中,会涉及到一些软件的安装,例如不同版本的JDK,说到这里,那我就得提醒大家一下了,就是我们这套JVM系列教程使用的是JDK 8
这个版本的JDK,这是因为目前企业级开发中Java 8
使用的比例是最高的。当然了,肯定还有些公司依旧在使用较老版本的JDK,例如JDK 7
和JDK 6
,不得不说,它俩还是有一定的使用比例的,总之,目前市面上几乎所有做Java开发的公司采用的JDK都是JDK 6
及其以上版本的了,从来还没遇到过有公司使用JDK 6
以下版本的情况。
随着Oracle后期更新的Java版本迭代速度越来越快,目前官网发布的最新版本已经是Java 17
了,注意,它可是一个LTS哟,即长期支持的版本,其实,除了它之外,Java 11
也是一个LTS,这也就是说,如果你想要做Java开发(做Java开发肯定是要安装JDK的),那么推荐你首选安装JDK 8/11
版本的JDK,当然了,你也可以选择安装最新版本(即JDK 17
)的JDK,毕竟这是未来的趋势嘛!
这里,我再次强调一遍,我们这套JVM系列教程使用的是JDK 8
这个版本的JDK,也就是说未来我们所编写的Java程序绝大部分是要在Java 8
环境下来运行的,大家可要牢牢记住这点哟😊!如果在后续讲解的过程中,碰到了Java 9/10/11/12/13/...
乃至Java 17
当中的一些新特性,当然了,主要是关于JVM这方面的新特性,那么我也会给大家介绍到。
当然,如果大家有需要的话,那么可以自行去Oracle官网下载不同版本的JDK,以备后面时不时地需要用到。
在内存与垃圾回收这一篇章的内容的讲解过程当中,我们除了需要安装不同版本的JDK之外,还需要安装如下这些软件或者工具。
JClassLib_windows.rar
:读取字节码文件的软件,如果我们想要读懂字节码文件,那么就得用到它。MemoryAnalyzer-1.9.0.20190605-win32.win32.x86_64_zip
:Eclipse当中用的一个MAT工具。PXBinaryViewerSetup.exe
:也是一个读取字节码文件的软件。
以上这些软件或者工具大家从网上下载就OK了,这里不再赘述!
介绍完在内存与垃圾回收这一篇章的内容的讲解过程当中涉及到的一些软件安装之后,我再来给大家介绍一下学习JVM的过程中可以参考的资料。
很明显,我们可以参考的最权威的资料便是JVM规范,JVM规范从Oracle官网就能下载到,后续我会教大家如何从Oracle官网下载JVM规范。其次,就是一些讲述JVM有关的书籍了,大家既可以去买一些正版的书籍来看,也可以从网上去下载一些电子书来看,后者可能更加方便大家去阅读。
最后,我再来给大家介绍一下内存与垃圾回收这一篇章所囊括的所有章节内容,下面我一共罗列出来了16个章节。
- JVM与Java体系架构
- 类加载子系统
- 运行时数据区概述及线程
- 程序计数器
- 虚拟机栈
- 本地方法接口
- 本地方法栈
- 堆
- 方法区
- 直接内存
- 执行引擎
- StringTable
- 垃圾回收概述
- 垃圾回收相关算法
- 垃圾回收相关概念
- 垃圾回收器
怎么样,内存与垃圾回收这一篇章所囊括的章节内容是不是够多,够详细啊!大家现在该知道,写完这套JVM系列教程要耗费我多大的精力和心血了吧!所以,大家且看且珍惜吧!
总之,我希望任何一个Java程序员,不管你是才刚刚学完Java语言基础,还是已经从事过几年Java开发,看完我推出的这套JVM系列教程之后,都能够对JVM有一个系统的、完整的理解,最终以达到对JVM更深入内容的一个提升!这是我的初心!所以,大家才会看到内存与垃圾回收这一篇章所囊括的章节内容我分的是多么的详细!我相信在整个中文互联网界都没有哪一套JVM系列教程有我的这套详细,不是我吹啊,这是事实,你不相信都不行!
有童鞋可能会说,我学JVM干嘛要看你这套JVM系列教程,我看书或者视频或者网上的博客不行吗?可行,我又并没说过不可以,不过推荐你还是看书比较好,因为书准确率最高,博客的话其实准确率是比较差的,有些博客在讲解JVM这方面上真是一言难尽,讲的错不说,很多就是信口开河,乱说一通。
所以,我觉得我是时候该站出来了,我必须借助这套JVM系列教程改变这一乱现,混乱不堪已成过去时,正本清源即将来临。关于这套JVM系列教程,相信大家在上面也能看出来,我做了一个非常系统的梳理,此外我还遵循了三个基本标准,这三个基本标准分别如下:
- 内容详尽,不遗漏一点细节,方方面面均介绍到。
- 内容准确。
- 在内容准确的基础之上,希望能够以更通俗易懂的语言来将JVM的全貌对大家做一个讲解。
总之,我希望我推出的这套JVM系列教程能对大家JVM这方面的能力有一个质的提升。
上面大家也看到了内存与垃圾回收这一篇章所囊括的16章节内容,下面我就来简单说一下这16章节要介绍的内容。
首先,在第一章节我会讲述关于JVM的一些概述,要知道我们学习任何一门新的技术,一开始都得对其有一个感性上的理解,这是引子,是吧!然后,我们再从多个方面来了解JVM,大家心里肯定会有疑惑,这多个方面到底是哪几个方面呢?这里我也不卖关子了,直接给大家答案,大家下面可要认真听讲哟!
其实,我们可以整个把JVM分成三层,最上层是类加载子系统(即Class Loader SubSystem);第二层是运行时数据区,它是JVM非常重要的一部分,运行时数据区简单一点理解就是程序在运行过程当中各种各样的指令需要用到的内存中的一些结构以及其具体使用情况;最下面一层是执行引擎,像解释器、即时编译器以及我们常常听到的所谓垃圾回收器都在执行引擎这个结构当中。
可能有些小伙伴初次见到执行引擎这个玩意不知道该如何理解它,这是很正常的事情,不用过多苛责自己,因为我初次见这玩意也不知道,但是这里我想告诉大家一点的是为什么我们需要用到执行引擎,起因很简单,就是程序在运行过程当中各种各样的指令分配到内存空间以后,怎么让它们运行起来。
明白上述JVM分层之后,我相信大家应该不难知道该从哪几个方面来了解JVM了吧!你要是不知道也没关系,因为下面我也会详细说到。
第二章——类加载子系统,这一章节从名字上来看,大家都应该能知道它要讲的是什么,很明显,这一章节对应的就是JVM的最上层,即类加载子系统。
第三章——运行时数据区概述及线程一直到第十章——直接内存讲述的都是有关运行时数据区的内容,于是,很明显,这几个章节对应的就是JVM的第二层,即运行时数据区。注意,我这儿是将直接内存划归到了运行时数据区讲述的范围,当然,不划归过来也是合理的。
我想有些小伙伴可能还不知道直接内存是什么,不过这没关系啊,因为这里我会简单提一下,等到大家学到第十章——直接内存时,自然就能了解得更深入了。现在大家只须知道这一点就足够了,即方法区在Java 8以后就改叫元空间了,而元空间其实使用的就是本地内存,或者,我们亦可称之为直接内存,这也就是说直接内存实际上就相当于是我们的一个物理内存。
第十一章——执行引擎直至最终章节,不用我说,大家应该都知道这几个章节对应的是JVM的最下面一层(即执行引擎)了吧!不过,有一点需要大家注意,就是在这些章节里面,我单独抽取出来了一个章节来专门讲述StringTable,即第十二章——StringTable,其实正常来讲,这一章应该是要放在前面章节中来讲述的,而这里我却专门用一章来讲述,主要是由于以下四个原因。
- 在开发当中我们使用String是非常频繁的。
- 在
JDK 9/10
等版本中,String的底层结构发生了一些变化,具体指的是从一个char型数组变成了一个byte型数组,并且还额外加上了一个字符编码方式。 - 在面试过程中,面试官问到String方面的面试题是非常多的,而且即使是问到的次数很多,也并不意味着所有的人都清楚关于String的使用。
- 再且就是String在不同版本的JDK中存储位置也发生过变化,这样就导致了很多人对这块都是模模糊糊的,理解得相当不透彻。
正是基于以上四个原因,我才专门单独抽取出了一章来给大家把String讲透,希望大家能知道我的良苦用心。
后续的第十三章——垃圾回收概述一直到最终章节,不用我说,大家看章节标题应该都知道讲的是什么了吧!无非就是关于垃圾回收方面的内容,提醒大家一点,垃圾回收算是内存与垃圾回收这一篇章中非常重要的一部分内容了,大家可要认真一点学哟!
关于垃圾回收这部分的内容,我想我还是有必要来说点的,也算是提前给大家透漏一下将来在这一部分大家要学习的内容。
说点啥好呢,就这样说吧,数据在内存中分配完以后,如果我们要想重复利用现有的内存,那么就需要对已有占用的空间的数据进行一个回收。在这一过程中,我们重点关注的一点就是如何来判断已有占用的空间的数据是一个垃圾,而这就涉及到相关的算法问题了,大家应该知道,算法只是理论层面上的东东,实施层面才是那些具体的垃圾回收器。因此,我们就有必要看一下在Java发展的历史长河中都出现过哪些垃圾回收器,还有在JDK 9/10/11/12/13/...
乃至JDK 17
当中,有没有出现过新的垃圾回收器,以及垃圾回收器未来的发展方向是什么样子的。
以上就是内存与垃圾回收这一篇章所囊括的整整16章节内容,其实,这里面的每一个章节都包含有大量的细节,当然,这里我是无法来展开说的,只有等到大家学到具体的章节的时候,才会深有体会,现在有一个整体认识就好。
以上是关于我要写整个中文互联网界最牛逼的JVM系列教程 | 内存与垃圾回收篇概述的主要内容,如果未能解决你的问题,请参考以下文章
我要写整个中文互联网界最牛逼的JVM系列教程 | 番外篇:教你如何在自己的电脑上去安装一些专门解读字节码文件的工具