00:01
那么同学们,前两种我们快快的过了一下,那接下来这个才是我们的难度。Out of AR GC overhead limit exceeded,什么意思啊?G c overhead是不是过头了,就跟你喝酒喝的过头上头了,干嘛超过了最大的极限,那么他的这句话的意思就是说你现在程序呢,写的呢,特别的诡异。导致呢,这个Java的内存呢,急剧的上升。比方说大量的对象。被转载被新建出来,然后呢。启动了GC以后,也就是说这句话的意思就是说g Co head是不是超过最高警戒了,他的意思就说你这个资源98%。都用去做GC垃圾回收了,可是回收效果也特别的糟糕,导致这个GC一直。在运行那么好,我们来看一下。
01:00
那么它这呢是什么意思呢?先看图再看笔记,也就是说假设哈,我整个干嘛呢,堆内存,现在你看。Time used by GC POS,大量的资源被耗进去,干嘛去做垃圾回收占到多少98%,而有用的工作才杠二。那么大家都明白这个Java是吧?大部分的情况下是要在干活解决应用程序的问题,它不是去主要是去忙于GC,我们发明Java并不是为了垃圾回收,那么所以说他的意思就是说大部分的资源甚至超过98%的时间。那么呢,用来做GC了。回收了不到2%的堆内存,那么这个时候是不是干嘛?事倍功半都不到,是事做了很多倍,但是事情是回收的效果是很差,那么言下之意,这种情况下就会导致GC回收时间过长,就会抛出我们的out of memory error,什么意思呢?过长的定义就是这就这种异常的意思,这种情况就说百分之八九十八的时间被用来做GC。
02:09
并且回收了不到2%的对内存,这就很坑爹,这个性能和效果我们前面讲过,怎么看GC那些东西我们都清楚,尽量的是不是GC前GC号这个要很大的差距,你这个GC上它就有效果。那么连续多次GC都只回收了不到2%内存的极端情况下就会抛出这样的异常。就干脆什么我。我不收了,因为我们我这么收没有意义,GPM干脆罢工,因为哈,如果那你说那你继续收啊,可以你继续收,98%的资源被用来做垃圾回收,但这个家吧。还能正常运行吗?就算你不停的在过做着这个GC的工作,那这个是不是也是一种无用功啊?那么好,假设你不抛出这个错误,会发生什么情况呢?那么就是GCG的这么点内存,很快又会再次填满它2%左右的堆内存,我在外面6666,一大堆对象什么哟。
03:01
把它撑满了,那么这个时候干嘛迫使GC再次执行好吗?对象上来了,我去垃圾回收。可是我每次只能。回收不到2%的对内存没有意义啊,而且我1GC回收还让CPU飙高了,形成了恶性循环,那么CPU的使用率一直都是100%,没有任何效果。投入98%,你只赚出来一个二,那这种生意是不是还不如不做?干嘛?干脆我就告诉主人,我会报这么一个什么GC啊。Out of memory,报一个g Co over head这么一个故障,好,那么同学们理论知识我们大概了解了以后,不妨我们呢,来简单的来看一下,那么这种情况下,我们g c head这么个这个代码我们该怎么写呢?那么假设哈,我们int I等于。零吧,好。那么这个时候我们list,那么string。那么这个时候,List等于new。
04:01
Every list OK,那么好,那么这个时候呢,错,那么。接下来我们呢?直接呢?那么既然有这个错,那么我们呢,干脆呢,还是用这个代码块呢,给它呢包起来哈,Try catch。那么好,那么来,同学们,我们这就干一件事,我要出list.at那么。这块大家请看,那么strange.value of,我们呢,就加加这个I,然后得到一个是吧,String,那么加多少个点?Inter,那么这个时候是保证每个不一样,但是你这个list,待会儿我们故意把这个对应内存调小,你这样不停的去往list里面扭出来对象以后往里面list里面加,那么迟早有一天是不是会把这个Java虚拟机给。占满了,对应内存越来越多了,那么OK,那么这个时候呢,我们throw able,那么干什么呢?我们来看看现在我们呢,到底溜出来多少个,那么system out,那么。
05:11
那么这块呢,就是我们的I,我们看看我们这个I这个值。最后到多大,那么。12。好,那么大家请看,现在我们呢,就来在不停的溜对象,那么像这样,你你知道的哈,这个像这样的一个字符串,这种对象是不是就不停的溜用音去角这个呢,原来我们讲过,不再多废话,那么在我们的常量池,那么现在JAVA8是的me space了,那么呢,不停的去干哈,那么它重要。导致的效果就是这么一个回事,言下之意就是98的时间用来做GC,并且回只是回收了不到2%的堆内存。事倍功微连一半都不到那么好,那么同学们,我们呢,来改一下这个配置参数,来看看我们这个I会不会加多少次,好,那么这有个初步的估计,好,G c over ahead,我们直接。
06:03
粘一下我们的参数,然后呢,我们这儿多加了一个哈,就是顺便说一下直接内存的大小,我也给它变小啊,因为它这个默认太大,都跟我我的内存太大,呃,16个G,那么这个时候的话,直接内存太大,他不容易看到这个效果,我呢现在故意加这么个参数,其实这些故障都是杨哥故意把它呢弄出来是吧?好那么这个时候呢,同学们,我们呢,来看一下我们的。运行情况。好,OK,先不管怎么说,至少我们现在在这儿是不是看到了我们的另外的一种什么g Co的limit体的,那么这个时候的话呢,杨哥讲过我们的GC之间的。什么负GC?我们讲过GC的什么?怎么如何查看这个东东是吧?GC前GC后,呃,就是这个东东。同学们,这个不是废话啊。是不是详细讲过,前面注意规律是什么?GC前内存占多少,GC后内存占多少,然后该区域内的内存总大小,那么现在这张图就派上用场了。
07:11
他报了这么一个g cot。Exceed的这么这么一个exceed的这么一个故障,那么大家请看我负GC。之前我干了一件什么事,好样区GC回收之前是2047,回收之后还是2047,那大哥那你这个是不是根本就跟是做了回收,但是是不是收不动啊。对不对,再来看老年区干嘛,71267124。多少看回收前是7126回收做了这么一次。重量级的GC以后回收以后多少71242KB,那你说嘛。有毛用?那么再来。我们呢,M space个区3513 3513,那基本上是不是没变化,就是你不停的在做GC,但是收的效果跟没收也是一样,那总不可能像刚才这样哗哗哗哗哗的一直在做这样的GC,一直在做,你看多次的负GC,负GC负GC系统肯定变慢啊,那么大家看,请看是不是根本就干不住,我们只有十兆,我故意给它设小点,尽快看到这个故障和异常,那么就导致什么是产生GC了,但是回收效果不明显,那么现在这两条路,第一种你继续永远击私下去,你确实也在干活,但是事半功倍,第二种干脆抛出一场罢工,告诉主人现在这种情况干嘛,收不收的效果都差不多。所以说这种情况下,那么请同学们要注意,Out of Mar arrow g c overhead limit。
08:42
XCD的,那么这个故障和异常要求同学们必须了解,因为最终干嘛清理的这点内存很快又再次填满,又迫使GC再次执行,我倒是愿意去执行GC了,但是这么多负GC看了干了以后效果根本就不好,而且大家看多少这个I145541次啊。
09:04
您看看这个程序运行的多快,这个I,我们那个这个I是哪的,是不是这个。每次外出啊,都给他加个一没问题吧,那么所以说接近有个出估14多万次那么好了,实在是受不了,GM也觉得我这么做已经毫无意义了,我是在干活,但是我干的是无用功。那么呢,CPU使用率一直高,GC没有太大的效果,干脆我报出这么个异常,主人重新去修改你的程序吧,那么好,呃,顺便说哈,实际工作中不许写这样的程序,那么尤其是我要出这样对不对?我只不过是为了讲课,故意出这么一些坎,给大家看到这样的一种异常,好,那么这个。就作为一种知识和了解,那么这个异常望同学们一定要掌握背下来,说白了就是一句话,超过百分百98%的时间系统资源用来做垃圾回收。暂且。但是呢,回收效果不明显,只回收了不到2%的堆内存,GC是去干了,但效果不明显,所以说GC overhead OK。
10:05
好,那么这个我们呢,就给大家介绍到这儿。
我来说两句