00:00
来接着呢,咱们给大家举个例子啊,其实这个呢,是涉及到我们后边讲的这个JC的情况了,哎,不过呢,我们也稍微呢在这儿说一下,诶这呢我写好一个代码,这个代码呢,相对来说也比较简单啊,这个每次咱们开代码都说的比较简单,这个相交于咱们写这个具体的业务代码来讲呢,现在的这个代码呢,确实呢都非常简单,就是根据我们这个需求啊,咱们造出来相应的一些这个具体的代码规则啊行,这呢我定义了个变量I,这呢是一个集合,我们定义的一个string,然后呢,把这个呃字符串呢,加到我们当前这个list当中,不断的让这个字符串呢做一个这个连接这个这个拼接这个操作,然后这个I的话呢,主要是来记录咱们便利了多少次,嗯是这样一个情况,嗯相对比较简单对吧,那么在这个执行的时候呢,我们主要目的呢,是为了测试这个叫mini jc me jc和for c,其实呢,就是我们想看一下这个垃圾回收的这样的一些行为,嗯是这个意思,嗯这呢,咱们需要呢,做一个这个参数的一个设置啊嗯,参数设置呢,首先咱们把这个嗯编一下是吧。嗯,编译完,编译完以后呢,我们这个比如说想看自己码文件啊,是必须要进行编译的,实际上我们这块呢,要想这个去执行的话呢,其实一开始你不去编译也行是吧,直接呢,打开我们这个run呢,去配置这个参数也可以啊行,那针对我们这个JC啊这呢我已经写好了,就是这呢是设置我们这个对空间的一个大小,我们呢,必须要加上这样的参数,叫print jc details啊一定要加上啊,注意呢,这块是个加号啊,就是显示一下我们这个垃圾回收的一个详细的信息,能够显示我们这个新生代老年代啊,甚至说呢,关于这个方法区垃圾回收的一些细节,OK。
01:31
然后呢,我们直接呢,做一个运行。啊,很快的呢,这个程序呢就结束了,因为呢,我们这里边呢,是不断的去拼接,呃,这呢,咱们要提到一个点就是这个字符串啊,呃,相当于它的这个信息实际上是存储在自符串常量池,是存在我们这个堆空间的。啊,这个呢,是涉及到我们这个,呃讲方法区的时候呢,我们会提到这样的知识点,就是租串常量池呢,是存在这个方法区,OK,呃,存在这个这个堆空间,说错了啊,以前呢是在方法区,后来呢,咱们改到了这个堆空间,哎是这样一个情况,那我们不断的去添加的话呢,再去拼接是吧,再添加是不是会导致我们这个,呃对空间是不是就撑爆了,所以这块呢,就出现OM是对于针对我们这个叫对空间,诶出现了这个问题,好,那么我们看一下上边这块出现的这些信息,这呢就是咱们这个JC的这个算是日志。
02:21
诶,这些这个日志,那后边呢,咱们讲这些的时候呢,还会说啊这块呢,简单的咱体会一下,在我们这个数据的执行过程当中,咱们呢,肯定也知道啊,是不是先要把数据放在这个伊甸园区,然后呢,这个通过年轻代的垃圾回收啊,就是young jc,然后我们放到这个survivor区,对吧?然后呢,接着呢,再考虑往这个老年代去放,整个这个过程老年代呢,空间不足了,是不是会触发我们的叫OM,所以通过这儿呢,我们能看到的信息呢,是这样子的啊首先呢,整体来看,嗯,这里边呢,写的这个叫JC的这个呢,那其实涉及到的都是我们关于这个新生代的一个垃圾回收,那么写的这个叫for jc呢,针对的就是我们这个老年代啊,当然这呢,其实也不光是老年代了,就涉及到我们整个这个呃堆区,甚至呢,包括这个方法区,那这块呢,也会涉及到他们的一个垃圾回收,所以这呢,我们称为叫four GC,那当我们出现这个OM的时候呢,我说呀,之前啊,一定是经历过这个four GC。
03:18
为什么这么讲啊啊,因为呢,咱们这个通常咱们这个报OM了,就是堆空间,这个老年代是不是空间不足了,那老年代这个空间不足的时候呢,我们首先呢,要进行一次垃圾回收,那垃圾回收之后呢,发现仍然空间不足,我们才会报这个OM,所以说呢,OM之前呢,我们通常呢,都会看到有一个叫four GC是吧?诶这是其中这样一个情况,然后这次呢,For GC是不是显示呢,算是叫失败了,因为呢,我们没有这个回收成功啊,所以呢,导致我们这个诶就报了这个OM这样一个情况,好,那我们来看上边这个叫样JC的这个情况啊,那在这个样JC的时候呢,首先我们基本上大家后边呢,咱们会详细的说这块呢,就简单的带大家看一下啊,当我们这个新生代满的时候。
04:05
说错了,准确的讲呢,应该是新生代中的这个伊甸园区满的时候,对吧,当我们这个伊甸园区满的时候,或者叫空间不足的时候啊,我们呢,是要触发这个叫样JC,那么这儿呢,显示的就是咱们这个叫新生代,注意新生代垃圾回收之前它的一个空间大小。这呢是进行完这个样JC之后,新生代的空间大小。就这个里边呢,是不是包括了我们这个叫survivor区是吧?所以呢,你会发现怎么没有变成零呢?那要变成零呢,是不是就意味着我们这个新生代就全没了呀,那这呢,咱们还有一些数据是不是在这个survivor区啊,所以这里边不会变成零,这呢是记录咱们新生代的一个总空间的一个大小。哎,新生代总空间的一个大小啊,这要注意是不是咱们后边呢,这也能看到,嗯,这个区域加上这个值,再加上这个值,是不是这几个值呢,我们加一起,哎这呢就构成了我们这个区域了,是吧?哎,就是这上面这个值,哎这个大家注意一下啊呃,那同学会发现,诶怎么这个里边弗区跟那个two区这个大小还不一样的,正常我们说这两个区域是不是大小应该是一样子的呀,这呢,其实是实现了一个就是我们前面讲了一个叫内存分配的一个自适应这样个策略啊,是会有这样,那我们关闭到自适应的时候呢,它就不会出现这样的问题了。
05:20
嗯,行,这是我们说的这个新生代的一个总空间大小。那么这呢,是涉及到我们这个叫堆空间。堆空间在垃圾回收之前的一个大小和之后的一个大小,这呢是堆空间的总大小,堆空间呢,咱们整个呢,是不是设置成,诶刚才在这块看到的,诶,我把这个CTC一下啊,把它粘到这。这个堆堆空间的话呢,我这块整体呢,是的是不是就九兆啊,哎,这就我们这个九兆的空间,那这个数呢,你会发现诶怎么跟这个数一样的,因为在咱们第一次进行这个呃样的一个GC的时候呢,咱们老年代是不是没有数据啊,所以说这里边这个数据呢,完全呢就是我们新生代的数据了,这呢是咱们说这个堆区这个呃,在进行这个样J之前的这个整个堆区占用的一个大小,这呢是进行完JC之后呢,剩下的一个大小。
06:10
你会发现呢,是不是跟这个数比这个数要大一些,说明呢,有些数据是不是放到我们这个叫呃老年代了呀,啊这呢就是我们进行JC划费的这个时间,好那么这呢是进行管一次这个央JC,那下次这块呢,是不是又我们伊甸园区这个放不下了新的数据了,我们又进行了一次央JC又进行一次,又进行一次,又进行一次,然后你会发现呢,咱们这个呃这块显示的是咱们堆空间占用的这个大小。那事后的话呢,你发现经营完这个,经历完这个young jc之后呢,咱们有一些数据是不是从这个幸存者区又被移到了我们的老年代,所以呢,经营完JC之后,你反而发现我们这个,嗯,对空间占用的这个内存是不是变大了,因为数据呢,放到我们这个老年代里边,OK,嗯,多了一部分老年代这个数据,行,那么这个数据呢,越来越多,然后再往下的时候呢,我们这个老年代这个空间呢就不足了,再接着呢,触发了一次我们这个叫for GC。
07:07
啊,进行完一次for这次的处罚,处罚以后呢,我们这个,呃,新生代这块啊,新生代这块呢,完全的就会清空掉了,哎,老年代的的一个变化,包括呢,后边关于我们这个,哎,这是这是老年代啊。这是老年代,诶刚才说的这块呢,是我们说的这个叫整个堆去的一个大小是吧,整个堆去的是包括这个老年代的啊,然后在我们这个for jc当中,大家也会发现呢,这块是不是显示了我们叫me达space,这呢是因为咱们用的JDK8啊,那如果呢,你用这个七之前的话呢,这就是叫诶permanent啊permanent就是我们说的这个永久带了,那圆空间的话呢,你看这个是没有变的,这是它的一个圆空间的总大小,这个没有变呢,是因为我们没有涉及到类的一个卸载的情况啊,这的是我们这个for jc所花费的这个时间。OK,那建立完这个for这C之后呢,我们进行了相关的一些垃圾的回收了,所以导致我们又可以往新生代上去放数据啊,那再去考虑放数据,然后的话呢,这块直接因为我们这个字符串是不是越来越大呀,呃,下次呢,直接没放完,直接就放到我们这个,呃,相当于这块呢,我们新生代是不是又又满了是吧,这个又进行了一次GC新生代的一个垃圾回收,然后呢,又进行了一个for g c,这个时候呢,导致呢,空间不足,老年代呢已经不能够再放假数据了。
08:23
哎,你看那个老年袋的话呢,我们在这呢进行回收的时候呢,咱们这是老年袋是吧,这是它一开始,这是它之后的这个回收以后的这个效果啊,这呢是我们这个,呃,这是老年代的一个情况啊,这是咱们这个整个这个占用的一个情况。诶发现的其实并不理想是吧?诶所以呢,导致咱们这块呢,诶再去添加数据空间不足,诶报了OM行,那这个呢,咱们到后边呢还会讲啊然后大家呢,也可以呢,你呃任意写一个代码,只要你这个代码里边涉及到这个OM对空间的溢出这样的情况,诶即即使你不出现这个下边对空间溢出的情况,我们仍然是可能出现,诶会出现这个JC的问题的,是吧?会出现这个JC的一个记录的,诶所以呢,大家也可以来看一看这个JC的一个日志,诶后面的话呢,我们讲到JC呢,还会来说这个事啊通过刚才这个描述呢,我们是化的一个角度,前面呢,我们是通过这个可视化的一些工具来看的,对吧?那我们这呢,是通过这个相关的一些这个参数,查看一下我们这个JC的一些细节问题。
09:24
好,这个呢,大家了解一下。
我来说两句