记录一次生产环境OOM

生产环境突然频繁挂掉,查看日志报错OOM

光看日志没法确定原因,于是想把内存dump下来分析

首先来看看tomcat的启动脚本startup.sh,在tomcat的bin目录下(这里的版本是tomcat8.5)

启动过程中会去执行catalina.sh,以下是catalina.sh的部分内容

如果setenv.sh脚本存在的话,启动tomcat就会去执行这个脚本,这里很适合添加自定义的参数

vim setenv.sh 创建这个文件

写入:JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Xmx6144m -Xms6144m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/www/server/tomcat/oom_dump"

esc-->:-->wq

-Dfile.encoding:指定文件内容编码格式

-Dsun.jnu.encoding:指定文件名的编码格式

-Xmx6144m:设置JVM可用最大内存为6114M

-Xms6144m:设置JVM初始内存大小为6114M

ps:这个服务器的内存为8G,分配了6G给JVM,接近极限了。

-XX:+HeapDumpOnOutOfMemoryError :在发生OOM的时候保存快照

-XX:HeapDumpPath=/www/server/tomcat/oom_dump":快照保存地址“/www/server/tomcat/oom_dump”

ps:这里一定要确认tomcat是否有权限对该文件夹进行修改,比如我这里是用www用户启动的tomcat,我用root用户登录服务器创建了/www/server/tomcat/oom_dump文件夹,默认权限是需要root权限才能访问的,setenv.sh文件也一样要注意权限问题。

命令groups [用户名] 可以查询用户所属的组,直接输入groups是查询当前登录用户的组

修改文件夹所属的组和用户,使用命令:

chown 用户名:组名 文件夹名/文件名

chown  www:www  /www/server/tomcat/oom_dump

chown  www:www  /www/server/tomcat/bin/setenv.sh

用户名没有冲突的话也可以直接使用chown  www  /www/server/tomcat/oom_dump

果不其然再次OOM。。T_T

找到/www/server/tomcat/oom_dump/java_pid12907.hprof

下载下来,然后推荐使用eclipse的MemoryAnalyzer(MAT)来分析,简单好用

打开eclipse-->help-->Eclipse Marketplace,搜索MemoryAnalyzer-->Install

MAT教程:https://www.cnblogs.com/UncleYong/p/7743294.html#MySignature

ps:依据快照文件大小可能需要调整eclipse的配置

打开eclipse安装目录-->找到eclipse.ini-->编辑,将-Xmx调大,我的快照文件是1.5G,我这里调大至-Xmx4096m,eclipse的JVM内存小于快照文件大小会导致打不开。

打开MAT面板

Open Heap Dump -->选择快照文件会得到如下视图:

1.Histogram可以列出内存中的对象,对象的个数以及大小。

2. Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
3.Top consumers通过图形列出最大的object。
4.Leak Suspects通过MA自动分析泄漏的原因。

点击Dominator Tree

这里我点开最大占用的对象

发现是嵌套ArrayList,里面全是字符串,占用了将近700M(原本服务器设置的最大堆内存为2G)

最终找到了引发OOM的类,查找到了原因,业务是加载oss上的文件,读取文件内容存入List再转成json返回给前端,但是该文件太大了。

修改接口为只返回文件路径给前端,点击查看才尝试加载文件,如果大小超过2M则提示不支持预览,请下载后查看。

另外Leak Suspects-->Details-->See stacktrace也能定位到问题发生的位置。

本文有不当之处还请各位看官不吝赐教,感谢查看。

原文地址:https://www.cnblogs.com/zou-rong/p/11952825.html

时间: 2024-08-02 13:07:28

记录一次生产环境OOM的相关文章

记录一次生产环境构筑

国庆前要构筑好云心办公的生产环境,nginx+tomcat(多个host)+mariaDB(multiple replications) tomcat多个host配置好了,检查下日志,额,项目的日志没生成? 没有. tomcat自己的日志大段大段. 神码情况? 把tomcat本身的日志换成了log4j,然后项目的日志还是没有,tomcat自己的日志,哇,似乎所有lib日志都是trace等级了. 下面是尝试的步骤: 检查tomcat的log4j.properties,log等级都没问题; 项目日志

生产环境OOM\死锁问题排查修复

OOM: 1.快速恢复业务:如果是集群中的一台机器故障,先隔离故障服务器:如果是多台,则根据Nginx转发策略,对该功能转发到单独的集群,与其他流量隔离,确保其他业务不受影响 2.收集内存溢出Dump文件:方式有两种: 1.设置JVM启动参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/jvmdump 设置之后,在每次发生内存溢出时,JVM会自动将堆转储,dump文件存放在-XX:HeapDumpPath指定的路径下 2.使用jma

Django 生产环境部署-记录 nginx+uwsgi+Django

这几天一直研究django生产环境的部署,看了很多文章,都写的很好,有些时候只是环境不太一样,配置过程中出现了很多的问题,例如: uwsgi  ---module   一直运行不起来,,加--file参数才可以... ----亲测可以运行----- 1.安装DJANGO,创建工程项目,确保python manage.py runserver 0.0.0.0:8080 能够正常启动 2.安装uwsgi , 在你的机器上写一个test.py # test.pydef application(env,

redis的单机安装与配置以及生产环境启动方案

简单介绍一下redis的单机安装与配置,方便自己记录安装步骤的同时方便他人获取知识. 首先,从官网下载最新版的(稳定版)的redis安装包.官网地址如下:https://redis.io/download 下载源码包后,redis需要编译安装.需要安装gcc和tcl,gcc用于编译tcl用于测试. 使用命令安装gcc,yum install gcc,一路选择yes,gcc就可以安装成功. 接下来安装tcl,首先获取tcl源码包(见百度云盘)或者使用命令:wget http://downloads

生产环境部署squid服务

网络拓扑 该实验使用虚拟机模拟搭建,准备开启2台虚拟机,客户端用本记代替. 1.Squid服务器使用2块网卡.如下图显示: 2.Web服务器与squid服务器配置在同一个网段即可.如下图显示: 3.客户端IP与squid服务器网卡1是在同一网段上即可.如下图显示: 4.查看squid服务器上的eth0和eth1网卡ip地址 5.查看web服务器的ip地址 6.先测试客户端能否ping通squid服务器的网卡1. 7.测试客户端能否ping通web服务器,ping不通正常. 8.安装squid软件

redis概述,特点,与Memached的不同,生产环境主从配置,redis配置文件解析

Redis概述: 是一个基于Key-Value的持久化数据库存储,支持丰富的数据类型,用C语言编写,可基于内存又可持久化的日志型.Key-Value数据库,并提供多种语言的API Redis特点 1.Key-Value健值类型存储 2.支持数据可靠存储及落地 3.单进程单线程高性能服务器 4.单机qps(每秒查询率)可以达到10w 5.适合小数据量高速读写访问 Redis跟Memached的不同 1.Redis可以持久化数据存储 2.性能高很,Redis能支持超过10W每秒的读写频率 3.丰富的

生产环境使用Nginx+uwsgi部署Django

在本地运行django应用相对来说还是挺方便的,使用自带的runserver启动即可.如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等 在网上找到了不错的部署的教程,讲解的还是很详细的,我就不重新再整理了. 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上) – Django中国社区五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(下) – Django中国社区 但是作为记录,我还是要记录下部署中遇

生产环境遇到的hashMap非线程安全问题java.lang.thread.waiting

写在前面:工作有几年了,从入门到现在,遇到也解决了一些问题.(当然,框架级别的暂时还没有)一直以来,都是从博客园以及其他各大社区搜罗出来的各种fix方法.目前稍有闲暇时间,在看过大V沈剑的博文后,我也鼓起勇气来书写博客,记录工作中遇到和解决的问题(其中当然也包括我在博园获取的各种解决方法:能找到原博文的小弟一定会注明出处.)因为总觉得自己水平不够,怕写出来的文章误导了别人.以下是这周生产环境遇到的一个问题,写出来供大家参考. 现象 周五一大早,车子都没停稳(电动车),群里就开始在询问谁最近的代码

生产环境使用 pt-table-checksum 检查MySQL数据一致性

公司数据中心从托管机房迁移到阿里云,需要对mysql迁移(Replication)后的数据一致性进行校验,但又不能对生产环境使用造成影响,pt-table-checksum 成为了绝佳也是唯一的检查工具. pt-table-checksum 是 Percona-Toolkit 的组件之一,用于检测MySQL主.从库的数据是否一致.其原理是在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库执行,并在从库上计算相同数据块的checksum,最