00:00
好,下面进入加21当中的一个最重磅的升级,就是新的一个GC,叫做ZGC。它也是一个属于什么实验性质的一个目的的,也就是它还完全能够不保证用在生产环境当中不出问题,诶,所以在发展当中,但是它的出现已经非常令人瞩目了,哎,那么它的一些个新的特性,那么它新在哪呀?他说这个GGC是个scaleble。Ble是什么?哎,可伸缩的,可伸缩的low latency low latency是,哎,很短的延迟,也就是延迟很短,Garbage collector GC,好,那么这是一个可伸缩性的。
01:00
并且是什么低延迟的这样一个GC,那么显然我们之前的GC,它的延迟是不是就会很很长啊,就像我们刚才做的那个实验,我们的GC它在后台运行的时候啊,其实耗了很很长的时间,我们没有去具体的测试它,但是呢,哎能够感受到这一点,而ZGC则是什么?哎,则是一个延短延迟的,哎短延迟的。那么这是这呃JAVA11当中最为瞩目的特性,哎,特性,那么他在官方的文档当中特别提到了有一些个,呃,有一些个这个数据GC暂停时间不会超过多少十毫秒,也就是说它的暂停时间不会超过十毫秒,那么小于十毫秒,小于等于十毫秒,最多十毫秒,这是非常非常大的进步,非常大的进步,那么即使我要处理几百兆的小堆,哎,它既能处理几百兆的小堆,也能处理几个T的大堆,也就是说它的伸缩性就体现在对应内存的一个,呃管掌控上面,你小内存没问题,大内存呢也是可以的,但是呢,小内存体现不出它的优势,那么它的优势在于什么?大内存,那大内存那么它和G1相比,呃,就是我们现在主流的垃圾回收器机相比,它的应用的吞吐能力。
02:31
哎,不会下降超过15%,也就是说它的这个吞吐能力也是啊,没有问题的,那么也会为未来的GC功能和利用这个color的指针,诶是标上颜色的指针,以及负载这个loadberry优化奠定基础,哎,那么它对它的负载进行优化,那么它初始只支持什么六四位系统,为什么?哎,因为它的设计目标是支持TB级的内存,内存容量,那么我们说32位系统,32位的JDK它能不能用到TB级啊,用不到,哎,因为32位只能用到,哎四个G,四个G多最多了,他不可能用到TB级的,哎,TB级所以ZGC天从一开始就只能适应于64位,那么64位系统,我们知道64位系统它是使用八个字。
03:31
碟来作为内存编制的,哎,所以它的数据量是很大的,它的可支持的内存呢,也会变得非常的大,是不是到T级这样一个,哎,它远远的大于T级,哎远远大于T级,正因为如此,这个。保存引用的这个数据量由四个字节扩展到八个字节,这样的话,多出来的数据就会给我们无限的什么,哎,就有无限的可能了,我在这个,哎,我们在这个64个比特,哎,也就八个字节当中的使用这些个数据的时候,诶,这是我们之前的用32位,OK,这就是可以用到44个G的内存,但是呢,我们稍微的往后啊,高位用上一点点,那么它的内存范围就会变化很大,哎变化很大,那么在我们的GGC当中,哎,我们说它用的是什么?
04:32
用多少呀?哎,我们说它有22个比特,是22个比特是用于,哎,用于一些其他的数据的,那么64再减22是多少呀?哎是42,也就是他用42个比特来描述内存的一个地址编号,所以它的这个范围是绝对是超过TB级别的,而剩下的22个比特干什么用啊?哎,它有无限的可能了,那么我们的ZGC就是针对剩下的这22个比特当中,哎做一些个特殊的处理,哎特殊的处理,所以哎只有六四位,哎才能这样做,哎这才能这么做好,那么这就ZGC它是六四位的支持TB级内存容量暂停的时间低小十毫秒,它对整个程序的吞吐量的影响要小于多少15%,哎,百之15将来还可以扩展实现机制以支持不少。
05:32
啊,令人兴奋的功能,比如多层堆,哎,多层堆,那么因为我们刚才提到了一个指针,一个引用的地址,它的范围,哎,它的大小,存储的大小由四个字节扩展到八个字节以后呢,多出来好些个空间,那么就可以做很些很多事情,那么比如一些多层堆什么意思啊,哎,多层堆什么意思呢?就是有一些热对象和冷对象,什么叫热对象?热对象就是不断的频繁的使用的对象,那么这些个对象我就可以把它放到一个高速的。
06:07
啊,高速的内存设备当中好,那么另外的一些呢,不太常用的,我们就可把它置为放到一些个速度比较慢一点的闪存当中。啊,那么这是热对象和冷对象啊,或者是压缩堆,也就是说这个对象基本上整个生命周期用到一两次,诶,那么像这种情况,我就可以把它放到压缩堆,这样的话,我们的堆它的分啊,它的分区以及它的分类就会更加的细致,会更加的这个清晰,诶更加的清晰好,那么GC是我们Java的主要优势之一啊,GC和这va虚拟机这种模式,这是我们Java的主要优势,哎,主要优势,然而我们的GC停顿时间太长的话,就开始要会影响我们应用程序了啊,那么消除或者减少这个GC的停顿时长啊,就是我们啊GC的一个发展的目标和方向啊,方向,那么我们说在之前的G1当中,那么它会有一些个停顿,什么叫停顿呢?FGC为什么会引起停顿呢?啊,就是。
07:19
当我们去真正的去回收垃圾的时候,我必须要保证当前的所有的应用程序当中的线程必须怎么办?哎,必须停下来,不要再在内存当中制造混乱,然后呢,我才可以真正的去让GC去工作,那么这个过程我们说哎,有一个专有名词来描述它叫做什么?哎,STW。什么意思呢?哎,很简单,就是stop the world哇,感觉把整个世界都停下来啊,当然这是一个呃,这个夸张的呃形象的说法,那么在我们Java虚拟机当中,垃圾回收器要想去真正的去完成一个完整的GC,那么必须要有这个步骤,就是stop the word,把所有的线程都暂停了,然后开始进行GC垃圾回收。所以这个STW它的时间越长,那么对我们应用程序的影响也就越大,如果这个时间越短呢,对我们的应用程序影响也就越小,所以ZGC的目标就是缩短这个STW的时间啊,STW时间ZGC本身它是一个并发的。
08:43
并发,什么是并发诶,多线程,多线程它是用基于多线程,用户线程和GC线程是并发的,是基于region,什么region呢?啊,分区内存它会分为多个区哎,多个器并且是压缩型的,哎,压缩型的好,然后呢,它只有root扫描阶段会STW,哎在这里涉及到这个STW什么意思啊,哎,就是所有的线程全部停下来,所以它只有在root扫描阶段会停一下下,所以它的STW的时间就比较短啊,比较短,因而因此GC停顿时间它也不会随着堆的增长和存活对象的增长而变长,那么显然它在这里啊,隐含的意思就是我们之前的垃圾回收器,它会随着堆的增长以及对象的越来越多而使得STW的时间也越来越长,诶,这是。
09:43
诶,这是非常致命的,当我们的这个规模越来越大的时候,这个STW的时间就越来越长,所以消除它对于我们程序的影响是势在必行的,所以ZGC的目标就是这个好,然后呢,有一些统计数据,诶有些统计数据我在这里直接就给出来了,好,那么如果我们使用GGC,哎,使用在使用G1,然后两个做一个对比,那么我们就发现G1它的一个平均的时间。
10:15
这个等待的或者是延迟的时间是多少呢?啊,156毫秒。0.156秒,诶,时间也不是太长,但是要小心,它对于应用产程序来说已经是非常长的时间了,并且它的最大是多少呢?五四三五百四十三点八四六毫米毫秒,那么它是0.5秒,这个时间就太长了,哎,太长了,而我们的ZGC的实验结果却显示我们的平均时间仅有多少1.091毫秒,也就是它的一百五十六分之一,那么它的最大的呢?最糟糕的状况是多少1.681毫秒,是它的多少五百分之一,更加的夸张,所以这个压力越大,其实对于ZD的ZZDC来说优势越明显,诶,优势越明显好,那么它的用法是怎么用呢?哎,它和ABC的用法非常像,也是需要解,解开这个。
11:21
实验性的这个选项的锁,然后呢,Use z GC,哎,Use z GC,但是很遗憾的是这个ZGC它其实在我们的Windows操作系统当中的JDK里面还没有提供,哎没有提供,所以即使我们在这个程序当中,哎,比如我们在运行的时候,哎运行的时候给它换一下好,比如我在这里再新建一个啊,或者我直接把它复制一下,哎,Absolute test复制,然后呢,直接给它换成ZGC,哎test,哎z GC test好,然后呢,我们在z GC test当中,这个gar比这哎注意就不要它了,好,然后呢,在这个ZGC当中,我们去先来运行,要想运行,并且是不是要加选项的,好加选项好找一下主类,主类是谁呢?哎,ZGC好,然后呢,ZGC的一些个选项啊,我们这。
12:22
它会带过来一个选项,就是我们刚才的这个好,然后呢,我们先来还是FC运行一下,确保没有问题,好,确保没有问题,诶确实和我们刚才的效果是一样的,好,下面我们再来重新配置,让它使用ZGC啊,Use谁啊,不是AB了,而是use z j c,好,然后来运行,哎,运行的时候它就出错了,哎,他说这个选项不支持not supported,它不是不认识,是不支持,哎不支持说明什么,我们当前的平台就不行,好,那么我们怎么办呢?诶,那我们就可以把这个代码,呃。
13:04
转移到Linux当中去,哎,我这有个虚拟机里面装的是Linux操作系统,好然后呢,我们来打开好打开看一下,好我们来打开这个虚拟机,好重新登录一下。好,重新登录。好,暂停一下。好,我们把这个虚拟机打开,虚拟机打开以后,这里面装了一个Linux操作系统,好,然后呢,啊,我们打开主文件夹,因为主文件夹比较简单,好打开主文件夹以后呢。好,然后呢,我们来看一下呃,右击打开终端,打开终端以后,我们确认我们的这个确认我们的Java版本Java,诶进version进,然后呢,确认我们的版本,诶Java的十一点零点一,哎十一点零点一,也就是它是11版本没有问题,好然后呢,我们在这里来做一个简单测试,好那么我们新建一个文件夹叫什么呢?哎,就叫这个z g c z GC test好然后呢。
14:23
诶,打开新建一个,再来新建一个文件,新建一个什么呢?文本文件好,那么怎么建呢,好有机。好,Touch一个z g c test点炸了,好,然后呢,建好这个文件以后我们打开。打开它以后呢,我们就可以对其进行哎测试了,哎测试好,那么这是这个目录,注意这个这个终端可以把它关掉,哎只在这个目录下工作好,然后呢,打开它以后编辑好,那么编辑我们说它需要一个就像我们刚才哎的练习一样,需要写一个garbage诶garbage然后呢,Garbage然后呢,它的属性有两个,一个是double第一,然后呢,哎两个,第二个是double第二,好然后呢,哎注意它的方法是lie好finalize啊那么保证我们在回收这个对象的时候有一些个反应,好打印输出一下,好打印输出输出什么呢?哎,This,哎,这个当前对象正在背什么?哎,Is collecting,哎,正在背。
15:46
诶,回收好,然后呢,写主类,Public class z j c test好,主方法好,那么主方法当中,哎,和我们之前写的一样,好,好主方法当中用一个哎,List集合来来放什么呢?哎,来放对象好,这是一个list,用一个a read a list,好,注意这个是需要导入包的,来导入类来我们在这导入一下,当然我们也可以使用权限定好import java.u点行,哎,为省事,好直接导入进来,导入进来以后呢,啊,我们声明一个count复值为零,然后呢,再声明个波尔变量flag复值为true,好,然后以波尔为条件进入。
16:46
循环while flag,好,然后呢,在循环当中,哎,我们做这样的事情,list.at at啥呀,New一个嘎比折对象,好,然后呢,哎,如果这个计数器到了多少来着,500,哎,当然我们可以换一个比200吧,这个都问题不大,如果是200个,我就要clear一下,那么clear的话,一旦clear,那么这个集合当中这200个对象,所有的这些个对象都会变成垃圾啊,然后呢,哎,然后变成垃圾以后呢,哎,它还又继续循环,继续再添加新的GA壁的对象,所以直到内存是不是溢出为止啊好,然后呢,保存一下,好保存一下,我们来测试这个程序,首先我们到这个命令行下面来编译Java c星点Java好,编译这个程序好,那么编译好以后呢,哎,我们来确认它的class文。
17:46
键有没有问题?好,那么找不着符号garbage啊,注意拼写错误。好,那么这是拼写错误,Garbage garbage,好,重新再来编译。
18:09
好编译没有问题,好编译没有问题,编译过了以后我们再确认一下,呃,LS确认点class文件全都生成了,好,下面我们来运行,好那么运行诶,那我想试一下在这个Linux下面支持APP con吗?哎,肯定是支持的是吧,但是无论你是用APP con GC还是ZGC都必须先解锁这个实验,实验的选项unlock experimental vam options,哎,所以单词比较长,要要小心,好然后呢,再减叉叉冒号,加use use什么,哎,Use这个Apple c冷GC,好,后面跟上主类z jc test运行好,那么运行的时候没有任何输出,为什么呢?因为这个absolute GC不做任何的真正的垃圾回收,所以他直到什么。
19:09
哎,直到内存溢出,它是不是就停止了,哎,所以这个地方我们发现电脑开始变慢了,为什么呢?诶因为内存用的很多,诶内存用的很多好,然后呢,再稍等片刻,稍等片刻以后呢,这个虚拟机就会退出,哎就会退出。啊,那么它的速度还是比较慢的,哎,比较慢的啊,那么它的执行速度,因为这个Linux下默认用的用到的内存是很大的啊,很大的,所以它的这个运行起来的速度也比较慢,那么我们可以加上一个诶选项,限制一下堆的大小,好那么这终于结束了,我们可以在运行时是不是简单的限制一下堆的大小啊,怎么做呀?哎,减XMX哎,最大值,内存的最大值,堆的最大值多少啊,比如我们设置为100兆,哎,100兆好,然后我们再来运行,哎,这回就很快的,是不是就结束了,哎,很快就结束了,好,那么这是用到的什么GC啊,ABCGC,好,那么我们真正的目的是ZGC啊好,然后呢,我们把它换一下这个use z GC,然后回车,诶,那么们就发现很快的是不是也是。
20:39
是吧?啊,当然这个内存比较小,我们把它啊把这个选项先去掉,去掉以后呢啊,它内存是不是就比较大了,再运行,诶那么发现这个对象垃圾有没有收集啊,有哎很快的收集了啊收集了,那当然我们在这里没有用一个非常严谨的测试的方法,哎,没有用严谨的测试方法,只是演示一下看到它的效果,诶程序是不是也就结束了,在这个地方啊,我们说在程序的某一个地方出现了异常的输出啊,异常的输出。
21:14
好,那么程序的某个地方出现了异常的输出。看一下啊,说明程序已经崩溃了,哎在这里,那么为什么异常的输出和这个普通的打印这个交交叉了呢?啊,就是因为异常的打印是用错误流打印的,是不是这个是输出流,标准输出流啊,那么不管怎么样,程序结束了,诶那么和现在64位Linux操作系统当中,ZGC是可以使用的来,可以使用的好,那么这是这个ZGC的一个简单的测试,哎,我们说在Linux下面是可以用的,可以用的好,那么这个ZGC我们说它是实验性质的,并且它的设计的设计的这个前景,也就是他通过文档去描述的,特别的啊,特别的厉害,特别的激动人心,哎,所以它是值得学习的,那么这个ZGC的更多的细节啊,更多的细节我们可以通过阅读这个文档,哎,我在这里给大家提供了一个文档,叫Z。
22:20
c.DOS。
我来说两句