00:00
好,下面我们来看JAVA11当中两个呃重磅的升级,或者说其实呃,严格的说只有一个重磅的升级,最重磅的升级就是什么呢?就是这个ZGC,另外一个G呢,我们把它称为APP con,呃,GC,那么这两个GC是JAVA11当中新加的,那么第一个abon这个收集器呢,它是一个比较特殊的,哎,特殊的,而ZGC呢,哎,它是最为瞩目的一个特性,没有之一,没有之一,也就是它的改变是突破性的,哎,是突破性的。好,那么至于它的细节,我们一会儿讲,我们先来看这个简单的absille垃圾收集器,它是一个什么呀?它是一个no opno op是什么呢?哎。
01:00
就是说不做任何的操作的,没有操作的一个垃圾收集器,垃圾收集器,那么GDK上它对它的描述是什么呀?开发一个处理内存分配,可以创建对象没问题,但是呢,它不实现任何实际内存回收机制的一个GC,也就是说它不会帮助我们真的去回收回收垃圾,那么一旦可用的对应内存用完以后,GVM就会退出,诶,就会退出,所以它并没有真正的这个实现GC,那么如果我们有一个system.gc的调用,实际上也不会发生任何事情,那么这种场景下和我们呃,之前的一个。另外一个选项,呃,另外一个选项是disable explicit GC效果是一样的,那么explicit是明确的清楚的,哎,那么GC呢,哎就是垃圾回收disable,哎把它禁掉,也就是说我不需要不要明确的给我收垃圾,诶所以它和它效果是一样的,哎,效果一,但是这个是一个可以认为是一个独立的垃圾器,诶垃圾回收器好,虽然效果一样,但是机制不太一样,好那么因为没有内存回收,这个实现可能会警告用户尝试强制机C是徒劳的,哎,尝试,所以我们去调用system.gc方法,那么当然。
02:30
我们在这这个编译的时候,它是没有办法知道我们用了什么GC,所以啊,这个强制GC没有用好,那么它的用法。怎么用啊,哎,要加两个选项,一定要加两个,为什么呢?因为这个AB con,这个GC和我们的ZGC它们都是属于这一个特性,叫做experimental,什么意思啊,哎,实验性质的,实验性质的,也就生产环境当中能不能用啊,嗯,不建议用,因为呃,因为还在实验当中,还在实验当中,但是你想尝鲜没问题,Unlock这个unlock这个实验的vm options就可以,那就可以好然后呢,这是这个abil垃圾收集器,垃圾收集器好,那么我们来简单的用一下它,那么用一下它的话,那我们需要啊,写个简单的程序来产生一些垃圾,然后呢啊不断的去产生垃圾,最终会把这个Java堆给它耗光了,如果没有GC,那么对象的回收就不会有任何的。
03:41
动作,所以我们写一个类garbage,它里面有个方法find lie,这个方法会在GC对这个对象进行回收的时候,是不是调用啊,哎,它一调用我就有一段,有一段话打印输出,诶一段话打印输出,好那么这是呃,这是两个简单的测试,好我们新建一个。
04:01
哎,我们新建一个类来测试一下啊,新建一个类来测试。好,你一个类叫APP。Absoluteil test,好,Absoluteil test,然后呢,他需要写一个呃,专门用于产生垃圾的garbage,好写这么一个类,然后呢,在它里面啊有一些属性,好那么我们用什么呀?哎,可以用double,哎,Double第一,然后呢,呃,可以产让它产生一个随机数,或者我这儿就直接哎写死,然后呢,再来一个,为什么用俩double呢?哎,2DOUBLE的话,它的这个效果会关更明显,创建个对象占用的内存是不是更大呀?好,然后呢,诶最关键的在这儿,我们在这个类当中重写哪个方法呀?哎,叫做finalize I finalize这个方法它特别像什么呢?哎,像我们的finally,哎,但是完全不一样啊,Final是try catch当中的结构啊,Finalize,注意这是。
05:15
这是什么?大家注意,这个方法是GC在清除,哎,清除本对象时会调用一次,哎,会调用一次好,所以如果我的当前对象要被销毁了,那么它就会执行好。那么如果真的销毁,我们就打印输出一段话,哎,加上this this就是当前对象的引用,哎,那么我们来看一下this,它必然要带一个哈希马,然后呢,他被销毁,Collect collecting,哎,他是不是在会被回收啊,啊,被回收好,然后呢,这是一个垃圾,就写好了,然后呢,我们在这里写个主方法好,那么在主方法当中我去来测试,首先我们要想,要想把内存耗尽了怎么做呀,很简单,我是不是用一个死循环不停的创建对象,并把它放到一个集合。
06:15
当中是不是就OK了?好,我们来写一个集合,哎,Garbage,好,然后呢,这是一个类似的集合啊near,一个a list,好,你一个a list啊,可以使用类型推断啊,类型推断好,注意这个list我们需要重新导入,是javaer u list后面呢,啊也是如此,好了,现在集合好了,然后呢,我们写一个声明,一个波尔变量flag复制为true,然后呢,哎,再声明一个计数器countt,好,然后呢,啊,计数器。呃,计数器,计数器也是可以的,没问题,好,然后呢,我们再来循环循环,哎,我以这个flag为循环条件,因为它的数值为true,所以就相当于是个死循环,那么在循环当中我们就可以干什么I干添加谬一个嘎比值I gar比值对象往这个集合当中添加好,那么添加添加添加到一定的程度,比如添加了啊,添加到500个的时候,我给它clear掉,哎,Clear,所以我在这里做个判断,如果countt加加等于500了,到了500个那怎么办呢?哎,list.clear如果我一旦clear,注意这个list的集合当中的对象都会变成什么垃圾对象,但是注意这是500个,那么也就是说我下一次再往后执行的时候,看到佳加能不能再回到500,回不到了,所以再往后面的循环当中,所有的对象都会不断的往。
07:59
加当中添加知道什么啊,内存不够用了啊,所以这个用我们用这个例例子来测试一下这个垃圾回收器的一个工作,首先我们直接运行,如果我们直接运行它使用什么默认的垃圾回收器,是不是按默认垃圾回收器好,然后我们运行。
08:19
好,那么运行这个程序,诶,我们看到有好多诶被收集了,被收集了,好那么这里面有500个对象应该是被收集,为什么会有打印输出呢?因为当我们去添加更多的对象的时候,内存显然会什么,哎,会不够用,不够用的时候呢,会触发GC,哎,不会,会触发GC,当然我们说这个GC的触发一定是不够用才触发的吗?哎,不一定,哎不一定,因为这是G1垃圾回收器,用默认使用的是G1,好然后呢,我们在等待片刻,等待片刻,诶然后呢,这个。这个GC在不断的在工作,但是我们创建的garbage对象,它只能有500个被回收,那么剩下的我在循环当中不断的创建,不断的创建,那么那些个后来创建能回收吗?啊,就回收不了了,所以它在某一时刻出现了auto memory error error,好,那么在这里出现这个error说明什么?内存就不够用了,然后呢?啊,下个虚拟机退出啊,虚拟机退出好,那么我们刚才去执行的时候,有没有用到什么这个APP con GC啊,啊,注意没有用到啊,没有用到好,那么下面我们来验证一下,如果我去用这个APP con及C的话,那么它会出现什么效果呢?首先你要想运行它,要想用它,必须在运行之前配置一下,配置的时候注意是谁的参数啊,不是程序的参数,而是VM的参数,好,那么VM参数其中第一个一定要先干什么节?
09:59
解锁这个实验性的选项,减叉叉冒号加unlock unlock什么呀,Experiment experiment experiment experimental experimental vm options,哎,那么这个单词比较长,建议大家呢,自己去硬是把它背会一下,Experimental,哎,Experimental,所以刚才拼写还稍微有点点问题,Experiment少了一个爱experimental vm options,哎,其实要有的时候学习就是这样,强制自己去,呃,记忆背诵这些,然后呢,我们就慢慢的它记住了啊,如果你老是去抄,那么记不住,好那么后面我想用这个GC怎么做呀?叉叉冒号加,加什么use这个Apple c冷GC。
10:59
诶,这样的话,我就把这个实验的选项打开,并且使用这个APP con GC作为默认的GC垃圾回收器,那么这个GC会不会有动作呀,我们来运行一下,好,我们来运行没有任何输出,也就是这个嘎比这对象有没有,有没有被回收啊,没有,并且我们发现这个虚拟机很快的就退出了,为什么?因为它不会尝试做任何的真正的垃圾回收,所以auto e很快就跑出来,不像我们之前他去运行的时候,他在内部非常的哎,非常的纠结,诶,他非常的忙,因为它要不断的去释放而释放垃圾,那么显然最终释放释放也是不够用的,因为我们知道是用死循环不断的去产生垃圾,直到内存结束,而这个呢,你一旦用到了这个APP con GC,那么它很快就哎消失掉了,哎,很快就消灭。
11:59
掉了好那么这是这个APP con这个垃圾回收器,它的一个,哎,它的一个使用,好然后呢,我们再来看下面一个重磅的,好,那么当然在之前我们还是简单的这个说一下这个FC冷GC它的一个使用,它的这个原因,提供一个完全被动的GC实现。
12:23
什么叫被动呢啊,就是他不主动做GC,他具有有限的分配限制和尽可能低的延迟开销,他不做任何的延迟,但是代驾时内存占用和内存吞吐量,所以我们说这个我们这个GC当中,如果你弄的太复杂了,其实反而会延产生延迟,而而用这个APPC了呢,它就会显示的告诉Java虚拟机不要用GC了,那么显然执行效率肯定是高的,但前提是什么,内存不可以溢出,内存一旦溢出就会出问题啊,那么它的主要用途诶,性能测试测试,那么这个性能测试它可以帮助我们过滤掉由GC引起的性能假象,诶也就是说之前由GC参与以后,那么出现的一些个性能的一些变化,那么通过把它这个把这个GC相当于给它啊停止掉以后呢。
13:23
啊,那么他的一个问题就暴露出来,还有就是内存的一个压力测试,诶内存压力测试,那么如果我们的这个测试用力应该分配不超过一个G的内存。那么我们就分配一个G,分配一个G,然后呢,不许用,不要用GC,不让任何的GC来工作,如果不出问题,OK,那么就没有问题,但是我们的程序一旦崩溃说明什么?有内存泄露,哎,有内存泄露,所以通过这个,哎,我们说这个内存压力测试是非常有用的,非常有用的可以及早的让我们去发现哪里有内存的泄露问题,哎,内存泄露问题啊,还有就是一些非常短的任务。
14:10
短的任务,那么就像这种任务,你再去让他去后台不停的GC,显然会降低效率,如果我们内促使内存给的正好足够用,诶,那么用这个APPCGC呢,就会,哎更高效,哎更高效。还有就是VM的一个虚拟机的一个接口测试,哎,还有就是一些延迟吞吐的一个改进,那么都是啊实验性质的啊,实验性质的对于Java虚拟机的一个调优是非常有帮助的,好那么这是这个APPC垃圾收集器,哎垃圾收集器。
我来说两句