• Eclipse-MAT 案例:Tomcat堆溢出分析


    学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记

    说明

    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发生了堆溢出了.

  • 相关阅读:
    开源大赛的种种收获
    外贸获客技巧整理
    10 款开源的在线游戏,点开就能玩的那种
    【学习笔记16】JavaScript函数封装习题
    C++项目——云备份-⑦-服务端业务处理模块设计与实现
    IP地址规划设计
    Go 如何实现多态
    启程,2022亚马逊云科技re:Invent Peter带来主题演讲
    机器学习实战:Python基于KDE核密度估计进行分布估计(十六)
    Unreal Engine 与 Blender - 比较指南
  • 原文地址:https://blog.csdn.net/qq_41489540/article/details/126334382