说明

tomcat是最常用的Java Servlet 容器之一,同时也可以单独做为web服务器使用,tomcat本身是用Java语言实现的,并且运行在Java虚拟机之上,在大规模请求时,tomcat有可能会因为无法承受压力而发生内存溢出错误.
这里根据一个被压垮的tomcat堆快照文件,来分析tomcat在奔溃时候的内部情况.

导入hprof文件

image.png

堆大小有29.7MB, 类一共有3.2K个,对象个数有833.8K个,类加载器有33个
org.apache.catalina.session.StandardManager@0x6d2cfa8 这对象占用了16.4MB空间,0x6d2cfa8 的对象这个就是我们所谓的最大的对象
分析oom内存溢出的话,首先就是要分析占用最大对象,

image.png

鼠标左键查看这个最大的对象引用了哪些结构

image.png

发现 StandardManager里面有个sessions占用了17mb大概,占用很大

image.png

image.png


发现有那么多StandardSession,怀疑是tomcat短期之内收到了大量的Session导致的

image.png

image.png

随便选一个session对象,查看左边的信息,上面是创建时间,下面是结束的时间,这两个时间做一个差值,就相当于这个session对象在内存中出现的时间了.
这两个时间就相差了一毫秒.通过这两个时间就能获取到相关的信息了.

image.png 写 语句,查看StandardSession,发现第一个StandardSession的创建时间和最后一个StandardSession的创建时间的差值,右边的减去左边的,再 *1000 , 然后再被9941个session对象除掉, 结果发现一秒得到311个对象,
由此推断,tomcat发生堆溢出时,tomcat在连续的30秒内,平均每秒接收了大概311次不同的客户端请求,导致创建了9941个session,结果导致tomcat发生了堆溢出了.