zoukankan      html  css  js  c++  java
  • 7.3.5 Tomcat堆溢出分析(1)

    实战Java虚拟机:JVM故障诊断与性能优化》第7章分析Java堆,本章主要介绍了Java堆的分析方法。首先,介绍了几种常见的Java内存溢出现象及解决思路。其次,探讨了java.lang.String类的特点,以及在JDK 1.6和JDK 1.7中的改进与区别。本节为大家介绍Tomcat堆溢出分析。

    作者:葛一鸣来源:电子工业出版社|2015-04-14 17:20

    开发者大赛路演 | 12月16日,技术创新,北京不见不散


    7.3.5  Tomcat堆溢出分析(1)

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

    图7.22显示了Tomcat溢出时的总体信息,可以看到堆的大小为29.7MB。从统计饼图中得知,当前深堆最大的对象为StandardManager,它持有大约16.4MB的对象。

    一般来说,我们总是会对占用空间最大的对象特别感兴趣,如果可以查看StandardManager内部究竟引用了哪些对象,对于分析问题可能会起到很大的帮助。因此,在饼图中单击StandardManager所在区域,在弹出菜单中选择“with outgoing references”命令,如图7.23所示。这样将会列出被StandardManager引用的所有对象。

    图7.24显示了被StandardManager引用的对象,其中特别显眼的就是sessions对象,它占用了约17MB空间。

    继续查找,打开sessions对象,查看被它引用的对象,如图7.25所示。可以看到sessions对象为ConcurrentHashMap,其内部分为16个Segment。从深堆大小看,每个Segment都比较平均,大约为1MB,合计17MB。

    继续打开Segment,查看存储在sessions中的真实对象。如图7.26所示,可以找到内部存放的为StandardSession对象。

     

    7.3.5  Tomcat堆溢出分析(2)

    通过OQL命令,查找所有的StardardSession,如图7.27所示(有关OQL,请参阅7.4节)。可以看到当前堆中含有9941个session,并且每一个session的深堆为1592字节,合计约15MB,达到当前堆大小的50%。由此,可以知道,当前Tomcat发生内存溢出的原因,极可能是由于在短期内接收大量不同客户端的请求,从而创建大量session导致。

    为了获得更为精确的信息,可以查看每一个session的内部数据,如图7.28所示,在左侧的对象属性表中,可以看到所选中的session的最后访问时间和创建时间。

    通过OQL命令和MAT的排序功能,如图7.29所示,可以找到当前系统中最早创建的session和最后创建的session。再根据当前的session总数,可以计算每秒的平均压力为:9941/(1403324677648-1403324645728)*1000=311次/秒。

    由此推断,在发生Tomcat堆溢出时,Tomcat在连续30秒的时间内,平均每秒接收了约311次不同客户端的请求,创建了合计9941个session。

  • 相关阅读:
    python之面向对象函数与方法,反射,双下方法
    python之面向对象的成员,方法,属性,异常处理
    python之面向对象性封装,多态,以及鸭子类型
    python之面向对象三大特性: 继承(单继承)
    AMAP-TECH算法大赛开赛!基于车载视频图像的动态路况分析
    深度学习在高德ETA应用的探索与实践
    高德SD地图数据生产自动化技术的路线与实践(道路篇)
    高德前端这五年:动态化技术的研发历程和全面落地实践
    深度学习在高德POI鲜活度提升中的演进
    高德技术评测建设之路
  • 原文地址:https://www.cnblogs.com/elenz/p/7989333.html
Copyright © 2011-2022 走看看