Tomcat堆溢出分析
# Tomcat堆溢出分析
Tomcat是最常用的Java Servlet容器之一,同时也可以当做单独的Web服务器使用。
Tomcat本身使用Java实现,并运行于Java虚拟机之上。在大规模请求时,Tomcat有可能会因为无法承受压力而发生内存溢出错误。这里根据一个被压垮的Tomcat的堆快照文件,来分析Tomcat在崩溃时的内部情况。
图1:
图2:
图3:sessions对象,它占用了约17MB空间
图4:可以看到sessions对象为ConcurrentHashMap,其内部分为16个Segment。从深堆大小看,每个Segment都比较平均,大约为1MB,合计17MB。
图5:
图6:当前堆中含有9941个session,并且每一个session的深堆为1592字节,合计约15MB,达到当前堆大小的50%。
图7:
图8:
根据当前的session总数,可以计算每秒的平均压力为:9941 / (1403324677648 - 1403324645728) * 1000 = 311次/秒。
由此推断,在发生Tomcat堆溢出时,Tomcat在连续30秒的时间内,平均每秒接收了约311次不同客户端的请求,创建了合计9941个session。
上次更新: 5/28/2023, 10:57:53 PM