正式服务器内存溢出追踪原因并解决(OOM)

实际场景:正式服务器以前一直使用正常,今天突然报内存溢出,tomcat重启后还是内存溢出

正式服务器内存溢出追踪原因并解决(OOM)

原因定位记录:(注 下面截图都是正常情况下的截图)

1.top 查看 java pid

正式服务器内存溢出追踪原因并解决(OOM)

2.查看java堆详细信息 jmap -heap pid

JVM基本结构图:
链接: https://blog.csdn.net/bluetjs/article/details/52874852.
正式服务器内存溢出追踪原因并解决(OOM)
正式服务器内存溢出追踪原因并解决(OOM)
正式服务器内存溢出追踪原因并解决(OOM)
Java中的内存分配:

Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

具体划分为如下5个内存空间:(非常重要)

栈:存放局部变量
堆:存放所有new出来的东西
方法区:被虚拟机加载的类信息、常量、静态常量等。
程序计数器(和系统相关)
本地方法栈

在这里就可以发现问题,通过优化虚拟机内存,
解决方法1:新增 setenv.sh正式服务器内存溢出追踪原因并解决(OOM)
正式服务器内存溢出追踪原因并解决(OOM)
因为我的是8核32G ,tomcat 启动内存就到了9G 还是内存溢出
所以伙这里配置16G ,重启tomcat 问题暂时解决。
正式服务器内存溢出追踪原因并解决(OOM)
下面找出具体原因

3.成交案例堆中对象的统计信息 jmap -histo:live Pid

正式服务器内存溢出追踪原因并解决(OOM)

4.打印类加载信息 jmap -clstats pid

正式服务器内存溢出追踪原因并解决(OOM)

5.查看等待终结的对象信息 jmap -finalizerinfo pid

![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200522085521464.png正式服务器内存溢出追踪原因并解决(OOM)

6.生成堆 dump 文件 jmap -dump:format=b,file=heapdump.hprof pid

正式服务器内存溢出追踪原因并解决(OOM)

7.导出到windows

正式服务器内存溢出追踪原因并解决(OOM)

8.使用分析工具分析

8.1 jvisualvm --jdk自带

正式服务器内存溢出追踪原因并解决(OOM)
正式服务器内存溢出追踪原因并解决(OOM)
正式服务器内存溢出追踪原因并解决(OOM)
可以看到byte数组占用了接近JVM配置的最大堆的大小也就是95%,显然这是OOM的原因。
正式服务器内存溢出追踪原因并解决(OOM)
第二步看一下究竟是哪些byte数组实例情况:
正式服务器内存溢出追踪原因并解决(OOM)
到这来我就已经找到具体原因了maxHttpHeaderSize(tomcat service.xml配置参数),因为每个实例大约20M
正式服务器内存溢出追踪原因并解决(OOM)

8.2 分析工具2-Eclipse Memory Analyzer(MAT可以更详细,直观的找到内存溢出原因-可以图像画)

注:安装包我已经上传
1.点击文件导入
正式服务器内存溢出追踪原因并解决(OOM)
通过类名看到是headerBuffer,还有output字眼,猜测这应该就是响应头的缓冲区,
正式服务器内存溢出追踪原因并解决(OOM)
希望可以帮到大家!绿光@664854541

上一篇:常用性能工具:工欲善其事,必先利其器


下一篇:JAVA线上问题排查命令