实战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。

7.3.5 Tomcat堆溢出分析(1)的更多相关文章

  1. CVE_2012_1876堆溢出分析

    首先用windbg附加进程ie页面内容进程,!gflag +hpa添加堆尾检查,.childdbg 1允许子进程调试,然后加载POC. POC: <html> <body> & ...

  2. Tomcat内存溢出的三种情况及解决办法分析

    Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三种 ...

  3. 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    转:http://tivan.iteye.com/blog/1487855 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严 ...

  4. 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出(转)

    前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...

  5. 使用Eclipse Memory Analyzer分析Tomcat内存溢出

    前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...

  6. [转]一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序 ...

  7. CVE-2012-1876:Internet Exporter MSHTML.DLL CaculateMinMax 堆溢出简单分析

    0x01 2012 Pwn2Own 黑客大赛 Pwn2Own 是世界上最著名的黑客大赛,意在激励白帽黑客们进行顶尖的安全研究.在 2012 年 Pwn2Own 大赛上,来自法国著名的安全团队 Vupe ...

  8. CVE-2013-0077:Microsoft DirectShow quartz.dll m2p 文件堆溢出漏洞简单分析

    0x01 前言 2012 年 10 月 5 日,exploit-db 漏洞公布站点上发布了 QQplayer.exe 3.7.892 m2p quartz.dll Heap Pointer OverW ...

  9. CVE-2010-2553:Microsoft Cinepak Codec CVDecompress 函数堆溢出漏洞调试分析

    0x01 前言 微软提供一个叫 Cinepak 的视频解码器,通过调用 iccvid.dll 这个动态链接库文件可以使用这个解码器:微软自带的 Windows Media Player(视频音频软件) ...

随机推荐

  1. 关于java中为什么尽量把受检异常转化为非受检异常

    首先理解一下受检异常与非受检异常: 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机操作中可能遇到的异常,是一种常见的运行错误,只要程序设计的没有问题通常就不会发生.受检异常与程序的上 ...

  2. Codeforces 1105C: Ayoub and Lost Array(递推)

    time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: sta ...

  3. 最基础的 swift 语言

    import Foundation //打印函数 print("Hello, World!") //不用加分号, 字符串就是"", 不用加@ print(&qu ...

  4. java自定义注释

    一.什么是注释 说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J2SE5 ...

  5. VritualBox安装CentOS及安装增强工具图文教程

    一  VM VirtualBox VirtualBox可在官网https://www.virtualbox.org/下载,完全免费. 二  安装CentOS系统(以CentOS6.9为例) 1.Cen ...

  6. vue使用axios 时 后台接收不到数据

    后台用django 时,默认接收的数据格式为formdata ,前端如果传了其他格式会出现后台收不到参数的情况. 前端参数转 fromdata 代码如下 let formData = new Form ...

  7. TCP/IP协议示意图

    TCP/IP协议示意图

  8. MySQL 读写分离(转载)

    原文地址:https://blog.csdn.net/justdb/article/details/17331569

  9. C++字节对齐与位域

    环境: win7_x64旗舰版.VS2015企业版 一.字节对齐: 说明:为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐. 1. 指定对齐参数值: ...

  10. C 逻辑运算, 移位运算 , 取整 , 取模(取余)

    一. 按位运算 (快速操作数据的某个位) ^   按位异或 ~  按位取反 &  按位与 |  按位或 二. 逻辑运算 &&  逻辑与   有一个值为 0 ,值为 0 ||  ...