00:01
来,我们看看。通过艰苦的学习。终于把第七个。题目拿下,我相信同学们,现在大家对这个垃圾收集器。这些参数,这些东东,那么应该是有一个深刻的了解了。抬高。是不是这个还没讲呢,就差他了。一点G1。第二个是不是横跨养老?养老区和样区。没问题吧?那同学们,接下来我们呢,来唠一唠记忆垃圾收集器这道题目。现在非常。常考我看过同学们的反馈,阿里、美团。包括这个饿了么都会问,尤其会问这个有没有听说过机垃圾回收器,他如果听说过,他和CM有什么区别。等等等等,那么来吧,同学们。
01:02
那不管怎么说,就以杨哥的程序而言,这个第六个这个配置啊,是不是还没给大家演示过呢,那么二话不说,因为有基础了,我这次倒过来讲,咱们先用一次基,然后再看看。那么首先哈。我们来捞一眼这个。拿掉来。所有的还是跟以前的配置一样,那么相当于说我这个类算是给大家收工,结尾我讲完了,那么现在我们单独讲记忆,那么怎么开启记忆垃圾回收器。那么就要。我们当前的这一个配置好同学们。废话少讲,运行一下。OK,来吧。出现什么情况?什么情况?首先在这里应该看出来个什么东西,给大家十秒钟思考一下,我暂停一下路屏。好,有些同学很敏锐。漂亮,我就喜欢这样聪明勤奋的九零后。有些同学直接就跟我说了,他说杨哥这儿只有两层。
02:06
以前我们是不是说新生养老没space啊,Keep是三层构成,但是现在结合着这个图,GE是不是变成了样区和old区一次性拿下,所以说大家请看keep这现在只有两层。干嘛?Garbage first,这就是变成什么。G1区,然后是什么区?Me space圆空间那么好,首先同学们我们先把这个减掉,来结合这块我们就会明白为什么基横跨样O的两区,第二个问题我们粗粗的看一遍,什么情况,首先。老规矩,我们追加的那个命令屁股后面现在跟的是不是这个参数了,代表你当前正在使去使用记忆垃圾回收器。哗啦哗啦哗啦,有这么声什么?你看parallel OK,诶,貌似又有什么并发的标志,诶,怎么稍微跟我们前面的c mouse稍微是不是有点一样啊,OK,那么呢,实不相瞒,他们两个还真的是有点接近,但完全不同,是两个东西了啊。那么这儿我们先粗略的给大家有一个感性的认识啊,顺便告诉大家怎么开启记忆垃圾回收器,这块我先非常肤浅非常粗浅的带着大家认识了一下。
03:23
上面是些什么你不要管,但是至少下面你给我记着现在的doing,我们证明了横跨样区,Old区只有两个,一个是GA笔first he,另外一个是me space圆空间。好。那么接下来回到我们这儿,这个G是个什么东东?那么在讲这个记忆之前,我们不妨再看看这个M串行并行M啊,这三个我们讲过了,现在我们讲最后一个记忆,一瞬间发现是不是有些正方形。像一些豆腐块,像一个围棋的棋盘,或者说像一个魔方的一面,变成一些小正方形,变成一些小区域块,OK,先有这个第二个感性认识,那么好,我们来来看看怎么会走到G1的,然后我们再说G1是什么。
04:13
我们先来看看以前收集器的特点,什么叫以前的收集器呢?就是那些串行并行和CM并发标记清除,它们有这四个特性。第一个。年老袋和老年,年轻代和老年代都是各自独立且连续的内存块,注意什么,什么情况各自独立,但是现在你会看得出这个是不是有点类似于合并了,其实,但其实严格的说也不是合并啊,只是说不再那么分。像以前一样分成两块,好,上面是一样,下面是old的,现在你就给我记着,记一是不是。横跨一样O着两个圈。第二个,以前是年轻代收集,使用一个伊甸园区加一个S0,再加一个S1区进行什么复制算法?以前的老年袋收集必须扫描整个老年袋的区域。
05:07
以前都是尽可能少而快速的执行GC为设计原则,那么言下之线这是以前的,那么我们再打开。这张图同学们可以看一下,我们现在假设啊,我把右边这个蒙掉单遮挡掉。创行并行有没有这种感觉?他们还好像还是一代的产品?IPHONE7 iPhone8 iPhone X,但是突然出现了另外一个革新的一个东西。华为mate X完全折叠屏不再是和以前一样了,是新的东洞了,那么我们下面就来看看什么叫G1垃圾回收器。首先。我们呢?来看看他的定义。第一个。GE8比first收集器是一款面向什么端服务端的,我们看官网。
06:00
这个G1为什么叫G,是GA,比first收集器的话,它呢,是一款偏向于服务端的垃圾收集。那么它目标主要是聚焦于更高的性能和更大的内存,那么它呢,这样意味着垃圾收集的暂停时间可以被压缩到的更小,并且伴随着更高的吞吐量,那么这个G拉机收气器呢,它是从GDK这个Java1.7UPDATE4这个版本呢?以及以后的版本开始支持,那么它呢,设计目的主要是有巴拉巴拉巴拉这么多,那么简单,把上面一翻现我们可以知道官网上的原话。官网的描述我们可以明白,计件服务端的应用在多处理器和大容量的内存,那么现在是肯定是多核多内存,云计算都出来了,什么硬件不是个什么事,所以说随着什么我们的硬件上面提升,内存也不贵了,哪一个现在随便掏出去四个CPU插主板上很正常,所以说多处理器大内存容量已经扑面而来,那么在实现高吞吐量的同时啊,尽量可能满足垃圾收集暂停的时间要变短的要求,是不是又有点既要又要,要马儿跑又不给马儿吃草。
07:14
那么除此之外,那么它还有以下特性。第一个,像CM一样,能够机时回收与应用程序并发的执行。我们刚才也看了这些,刚才的这些代码,它是不是有点跟M类似啊,那么说穿了可以并发执行,也就是说GC和应用程序一块,那么这样是不是干嘛在实现高吞高吞吐量的同时尽可能满足。收集暂停时间的要求变短,好整理的空闲的空间更快。那么需要更多的时间来。预测GC停顿的时间,那么干干嘛呢?我们呢,不希望牺牲干嘛?大的吞吐性能,不需要更大的Java keep,你看干嘛?
08:02
Don't not require don't not want to,那么都不需要,言下之意,它的特性完了以后,定义完了以后,说白了目的就是取代CM数据器,那么呢,它与cmo相比,那么你为什么我们现在慢慢的要从cmo过渡到G1呢?两个,第一个。不会产生很多的内存碎片。待会儿我们会详细说为什么不会了。第二个。停顿时间上添加了什么机制啊,预测机制啊,用户可以指定期望的停顿时间,哇,靠,这个真的不得了,这个老牛逼了,以前我们的GVM要垃圾回收了,你怎么知道他要停多长时间,鬼知道,现在就告诉你,比方说这个程序是你写的,根据这个资深老练的Java程序员,他会明白,那么假设我觉得这点东西干嘛不用300毫秒?200毫秒就可以。保定,那么这个时候我们就可以固定的设置一个他的stop的时间,保证你干嘛在规定的时间内尽量的完成,也就是说用户可以指定希望的垃圾回收时间,这个性能真的是提升的相当牛,那么接下来我们再来看。
09:08
那么CMS我们来看它之间的对比,虽然减少了暂停的应用程序的时间,因为应用程序和垃圾回收是不是可以一块并行,但是呢,它有内存碎片的问题,而且为了去除内存碎片,同时又保留了机器暂停时间点的优点,那么呢?于是呢,我们为了去除内存碎片,又要保留c Mo,是不是就我前面所说的既又又要,那么JAVA7开始有记忆了,那么我们的一二年Java提UPDATE4这个版本当中那么开始出现,那么现在我们是不是JAVA8,那么言下之意,一二年到现在一九年,那么坦白讲也不算是特别新的新技术了。那么or尔考在JAVA9现在呢?已经干了这事了,将G1变成默认垃圾收集器以替代CM,那么它是G1呢?一款面向服务端的,那么主要用于多CPU和大内存下面,极大的压缩减少了垃圾收集时间,而且还可以用户指定期望时间你来给我收集,全面提升这个性能,逐步替换JAVA8以前的C。
10:14
那么它主要的改变是什么呢?那么你这不会产生很多内存碎片,那为什么呀,抱歉啊,以前呢,干嘛呢,是伊甸园区,A40区一样区等等,它们是一条香肠一样,一根香肠,你要扫描的时候呢,干嘛你需要诊断诊断大块的去扫,说白了它现在已经是什么。把内存结构给变了,它的收集方式化整为零,变成了一个个大小一样的区块,愿解,那么刚才我们看过这个图片。我们把它抓下来哈,那还是回去看一眼吧。来,同学们。我刚才给同学们强调过,这哥们现在是不是像一个魔方的一个面,像一个围棋的棋盘,一块一块的这样的一个块的区域,单词上,单位上,那么干嘛就叫我们的是吗?Range区域块,那么每个range从一到32兆不等,哎,注意以前就告诉你,这个是一条从左到右,比方说这么一个什么长方形,左边伊甸园区,S0S1养老区,然后圆空间,它是一条大相肠,一个毛毛虫,现在没了画枕。
11:27
为零一块,一块的最高到多少?32兆,每一个区域都有可能属于伊甸园区,比方说这块伊甸园区,这块是幸存区,这块是养老区,那么这个时候就打散了,好那么这个时候呢,我们再来看那么记忆,首先我们从官网上的介绍我们就明白了他干一件什么事,那么服务端用于高CPU高内存的一款服务器端的垃圾收集器。现在已经作为JAVA9开始,作为默认的垃圾收集器机器收集器第二个取代的cmos好处没有碎片,第二个停顿时间更短,甚至用户可以自己指定期望的停顿时间,在这样的时间以内。
12:10
进行垃圾收集,那么这个时候没碎片收集的速度要比M快,第二个那停顿时间还更短,那么这个时候是不是吞吐量变高,停顿时间变低,这个性能是不是比以前更加强悍,更加牛逼?那么这个时候过特点。首先。充分利用多CPU多核的硬件优势,尽量缩短,缩短了缩word程序暂停。第二个整体上采用标记整理,那么言下之意,这么小块小块回收了以后马上压缩,以前有可能干嘛这么一块这个养老区它的内存干嘛,比方说几个字,刚才我们看了一小块多少,一到32兆不等,你清理一个3.2g的和清理一个32兆的,那这个是不是完全不一样啊,你一个人擦一张桌子和一个人扫一栋楼,那么这个工作量,这个清洁工的压力。
13:03
是不是不一样啊,那么再来我们看局部通过复制啊,没有碎片,这个是太牛了。第三,宏观上记一不再分。Old,它把它划分成多个独立的子区域ran,然后近似的理解为一个棋盘,然后呢,第四一点,整个内存区都混合在一块了,你中有我,我中有你,大家这一块化整为零,砍砍砍砍砍砍成一小块,小块就是一个棋盘,这个棋盘就是一个整体,但每一个都是一小块。然后呢,小范围以内,宏观上注意啊,宏观上不再分样O的,那么微观上落到具体的块,可能你是伊甸园区,你是幸存一区,我是养老区,我是另外一个。区域,那么这块具体落地那么小范围内啊,咱们再区分年轻和养老,还是保留了新生和养老带,但他们不再是物理隔离的了,而是一部分锐积区域的集合,且不用你是连续的,因为我们都知知道哈,像比方说像以前像这样,这个是样区,这个是O的区域,你。
14:13
干嘛?泾渭分明,楚河汉界像象棋的棋盘,那这个时候干嘛,你不可能样区里面有O的区,O的区里面有样区,这个说不过去,对不对?你不可能说一个人既是男性又是女性,他又不是李宇春。那么这个时候我们过来看,那么你不用连续,而且是你中有我,我中有你,那么自然也就不会采用以前的GC处理方式来进行该区域的处理,那么G器虽然也是分段收集讲过了,整体上标准,局部是复制,但是整个内存区不在物理上区分年轻和养老袋,而是需要完全独立的这样的堆做复制准备积极,只有逻辑上的分带概念,物理上他们不在物理隔离,而是一整块了哈,那么。
15:01
或者说。每个分区都可能随机的运行在不同的带之间前后切换,那么待会我们会讲到可能比如说哈这一小块,这一分钟是什么,伊甸园区它满了。他大家看他要产它怎么着,它不会产生内存碎片,那么回收了以后,它会尽量的把不是是空的内存区,我们给它联合在一块儿,那么这个时候什么尽量的让内存连续,所以说有可能。第一次啊,这个实际电园区,但是到后面突然发现同样是这块,它已经变成了养老区,因为那块已经变化了,它的角色和身份是在不同代之间可以前后切换的,那么大家一听这个性能干嘛,可以看得出记忆是不是一种从物理变革上,根子上,你看跟前三个完全不一样,所以说我们的记一就是什么不再整体区分物理上什么养老。年轻。化成区域块来管理,化整为零,好,那么呢,我们呢,对记忆是什么,我们呢,就先给大家说到这儿。
我来说两句