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

  • 相关阅读:
    JWT 弊端解决思路(主动过期\权限更新)
    MySQL企业级参数调优实践分享
    打家劫舍2(首尾相连)Java
    STL应用 —— priority_queue
    表格与表单
    flutter组件 InheritedWidget
    Android开发MVP架构记录
    荧光标记多肽FITC/AMC/FAM/Rhodamine/TAMRA/Cy3/Cy5/Cy7-Peptide
    群晖7.2版本安装Jellyfin
    linux入门---信号量
  • 原文地址:https://blog.csdn.net/qq_41489540/article/details/126334382