00:00
好同学们,那接下来的话呢,我们再给大家讲一个案例啊,这个案例呢,叫汤CAD堆溢出的一个分析啊,因为这里边呢,我再去模拟整个这样一个场景,然后最后呢,得出这个结论的话呢,呃,花的时间可能会多一些啊,那但由于我们上面已经讲了这么多的这个知识了啊,大家对于我们这个mitt的使用,包括呢,于我们实际生产环境当中这个呃问题的分析呢,应该有一个概念了,所以这儿呢,我主体上就把咱们整个这个案例中的这个截图呢,给大家留下来了,通过这里边的主要的这个截图,咱们同样的能够把这个事情呢,呃说清楚,所以呢,通过这个呢,哎,咱们大家呢,去这个讲一讲这个相应的经验啊,就跟说我们去这个学这个这个什么看这个老虎啊狮子啊,啊咱们可以呢,是直接通过图片的方式呢来看啊,你也可以呢,真实的到动物园呢去感受一下,对吧,只不过呢,我们上面呢,很多其实都是直接去动物园感受的,那这儿呢,咱们就相当于是通过这个图片的方式,我们也是一种教学方式,对吧?哎,通过这个呢,大家同样呢,可以去找相应的一些这个经验,好那这里边我们说一下。
01:00
嗯。那关于这个案例的话呢,我们首先提一提这个tomcad啊,这个大家开发中呢,肯定都知道啊,也都常用说它呢是这个呃的一个容器之一,同时呢,它也可以作为单独的这个外部服务器呢,这个使用啊,Toca本身呢也是用Java实现的,所以呢,诶,当我们把这个tomcad启动之后呢,咱们也会看到以一个toca为代表的一个Java进程。啊OK,那当我们进行大规模的这个请求的时候呢,他们看的有可能会因为无法呢,短时间之内承受过多的这个请求数据啊,产生这个内存的一个错误啊,内存溢出的一个错误啊那这呢,我们就在这个tomcat呃,整个呢,给它去设置了一个这个参数,在它被压垮的这一瞬间呢,我们去记录一下它的对快照文件,然后呢,我们进行这个,我们对这个对快照文件呢,进行一个分析啊,看看到底是什么原因造成的。好,那下边呢,我们就呃,针对于实际操作过程当中的这样一个需求,把这儿呢,主要的这个截图诶给大家留下来,这呢也足以能够说明问题,好当然呢,跟着我们这个思路呢,来一起来走一下啊。
02:01
首先呢,我们把这个呃大文件呢,导进去之后呢,这里边就看到了一些概要数据啊,这个概要数据里边这个SIZE29.7兆,诶这里边呢,我们首先做一个更正哈,呃,在一开始咱们讲这个MAT的时候呢,这个size我给说错了啊,我说的是咱们这个h pro这个文件的大小,其实不对啊,这个size的话呢,指的就是我们这个对空间的一个大小啊,对空间的一个大小啊,这个大家注注意一下,那这里边我们这个对空间呢,是29.7兆是吧?哎,就是不算大啊啊,你可以把这几个数呢给大家加一下啊,就能看到是吧?29.7兆啊,就是将近30兆,那这个类呢,一共是有3200个,然后对象的个数呢,一共是83万,这个3800啊个是吧,这个样子啊概述,然后呢,这个类的加载器呢,一共是33个。嗯,那这里边儿呢,我们这个呃,仍保留的这个大小呢,是16.4,嗯,这个呢,指的什么呢?这个是咱们看到的啊,是不是给我们分析的这个最大的这个堆的一个占用是吧?就是它这哥们儿的话呢,叫做standard的manager。
03:01
就他啊这个对象呢,它占用了是16.4兆。啊,它占用的是16点这个四兆的这个空间啊,就是我们所谓的这个最大的这个对象对吧,那一般的话呢,我们说呃,想分析这个,呃,他们看的呢,这个OM了啊对一出了,那我们通常对这个比较大的这个对象呢,是比较感兴趣的啊,他是我们首先呢怀疑的对象,对吧?啊就跟我们说这个,呃,公安办案的时候呢,这个出事了,不管是命案还是什么案,嗯,当时在场的这些人呢,可能是我们首先要怀疑的人,对吧。啊,就跟柯南里边也是第一第一个喊出来的这个有可能也是我们要怀疑的一个对象是吧?好,那这个时候呢,我们就针对于这个最大的这个对象呢,咱们点这个鼠标的左键啊,这里边呢,就能够对它呢进行一个跟踪啊在我们这个里边都是一样,那咱们应该大家给大家呢也稍微提过是吧?呃,针对咱们这个student这个H文件呢,你这块点左键啊,这边不就能出来吗?啊就这样两个选项啊,那我们这里边儿就想看一下当前这个最大的对象呢?呃,它到底呢,都引用了哪些具体的这个内部结构。
04:02
所以呢,我们就是叫出引用啊,Withoutgoing references啊,点上它好点完之后的话呢,我们就能看到在当前呢,我们这个standard manager啊,你看它本身呢,占用了就是17兆的这个空间啊,它这里边的话呢,有一个叫sessions。那它内部呢,有一个这个结构呢,叫做sessions,这个sessions呢,其实就占据了整个这个,呃standard manager,基本上他俩这个数据就差不多完全匹配上了,是吧,所以呢,我们要看这个standard manager,主要来看的话,是不是就这个session啊。好,这个sentence的话呢,我们同样的啊,可以去诶看它的这个outgoing references,然后把它呢里边呢再去打开,然后就会发现这个sentence里边呢,它主要的是叫segments啊,它自己呢,相当于它是一个concu和一个哈map啊这个concu哈map里边,Map里呢,它存储的都是很多的这个啊segments啊segments你看这个长度呢,是16啊,你看这两个数据呢,基本上也都是能够匹配的上的是吧?啊差不太多的啊,然后这个segments的话呢,一共是有16个,然后每一个的话呢,那基本上就是一兆。
05:07
或者一兆多一点是吧,16个加一起呢,就是这个17兆这样的一个大小,好,那这里边儿我们再想看是不是就想关心一下这个segments了。啊,这每一个就是大概一照的这个情况啊,我们再看一下具体的每一个这个segment啊。这个每一个具体的segment,我们看它里边实打实的这个数据到底是什么啊,针对于比如说这个segment,哎,我们看到它里边真正存储的这个数据呢,Value啊,就是我们这个standard session啊,下边的就相当于是哎这个另外的这个session了,是吧?好,那这呢,我们就看到这个session,这个standard这个session就是相当于我们存储的这个数据。啊,就是我们存储的数据,这个数据的话呢,每一个是有,呃,这个一兆多啊,一兆多这样一个大小,那每一个的话呢,都是这么大。啊,就是这么大,一共呢,是不是有这个16个这样子的是吧?好啊,那这个时候呢,我们接下来呢,就想做个事儿了,在咱们整个的这个session里边啊,这个session这里边到底有多少个,我们这里边看到这个session呢,每一个你看这个它是这么大的一个空间大小啊,哎,我们就怀疑是什么呢,有可能这个,呃,他们看呢,是在短期之内呢,收到了大量的这个session导致的,那这里边我们写一个这个OKOKL的这个语句。
06:20
哎,我们查看一下在当前我们这个大文件当中,到底有多少个这个,诶session这个standard这个session文件查完之后呢,发现一共是有9941个啊,还是非常多的是吧,那每一个三扇的大小呢,是1592这样的大小,那乘一起的话呢,大约就是15兆。哎,大概就是15兆,而我们整个这个堆空间的大小呢,是29.7,就是30兆吧,相当于它是不是占据了其中的一半的空间啊。对吧,还占着一半的空间,好那有这么多的session啊,占用的这个数据呢,也不小,我们下一个呢,担心的问题就是说这些session呢,是不是有可能在比较短的时间之内呢,创建的,所以这里边儿大家可以点每一个呃,随便选一个session哈,选一个session的话呢,我们就可以。
07:06
在它具体的左边能够看到它的一些属性情况啊,这里边有两个信息,第一个呢,就是它的creation time,就是它创建的一个时间,上面呢,就是它结束的一个时间,那么这两个时间呢,哎,做一个差值,就相当于它在内存中出现的这个时间了,对吧?哎,你看这两个时间呢,是不是这个离得非常的近吧。啊,一毫秒是吧,啊一毫秒啊啊,那我们接下来的话呢,通过这两个这个字段的话呢,我们就能够获取一些信息啊这呢我们再写了一个呃OKL语句啊,把所有的这个呃standard这个session呢我们都列出来,然后呢还通过一个排序操作,这呢就列举出来了最初的一个。啊,我们最初的一个,嗯,这个standard session,它的一个创建时间和最后一个standard一个session的一个创建时间,这两个创建时间的一个差值啊,你看这两个数相减一下是吧,右边这个减去左边这个再除以再这个。
08:00
哎,这个相当于是相当于是它再乘以个1000了,是吧。就是我们这呢,想给它换算成是一个秒。哎,换算成是一个秒啊呃,得到是多少秒的时候。啊,相当于这块是要除,这块除呢,因为在我们这除了在乘啊这个这个一样是吧?嗯嗯,这个我们想换算成秒啊,就一共是多少秒,然后呢,我们拿这个9941个这个session的总数去除以这个秒数,最终得出来结果呢是311,也就是说呢,我们一秒当中啊,就会得到311个这个session的这个对象。啊,得到这么多这个对象,那由此呢,咱们就可以推断啊,他钙发生这个堆溢出呢,就是由于在连续的啊这块讲完之后呢,大概就是呃,30秒的这个时间啊,在连续这个30秒这个时间之内啊,每秒呢,接收了311次这个客户端的这个请求,导致呢,我们创建了大量的这个session数据,导致咱们这个他们开的这个堆出现一个溢出问题了。啊,这呢就是我们最终分析的这样一个结论,那么大家呢,需要关心的是什么呢?就是实际呢,在生产环境当中啊,大家遇到的这个场景跟我这个呢,有可能是截然不同的,但是我们通过这样的一个案例的分析呢,大家知道我们思考问题这个方式是什么,然后按照什么样的路径呢?哎,去往下呢,一步一步的去去找啊就跟那个判案是一样子的。
09:17
啊,那对于侦探来讲呢,他永远面对的都是一个新的案例是吧?哎,我们不可能总结出来了一个套路,但是呢,我们对现有的这些这个这个案例的一些分析啊,哎,肯定有助于大家去了解一些新的一些,哎发生的一个生产环境中的这个场景。OK,哎这呢,就咱们对于这个他对易出分析这样的一个案例的一个说明,哎大家呢,这块呢可以,哎这个回味一下啊,理解一下整个这样一个环节,好,那到此的话呢,咱们就关于这个mitt呢,咱们就先这个告一段落啊,那么在mitt下边的话呢,我们讲解这个J之前,咱们再给大家补充两个内容。啊,因为呢,这里边MAT呢,重点关注的就是内存泄露问题,好,那咱们呢,再把这两个内容呢,来给大家讲一讲。好,那关于这节呢,MAT咱们暂时呢,就先说到这儿。
我来说两句