运维技术分享平台

 找回密码
 立即注册
首页
查看: 2240|回复: 0

关于Java Tomcat 内存溢出排查心得分享

[复制链接]

297

主题

306

帖子

1788

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1788
发表于 2020-5-14 10:58:25 | 显示全部楼层 |阅读模式
我网站不知道什么时候,开始内存飙升,从   Tomcat  启动后,初始内存占用4%~5% 左右,到20%、40% 最后服务器卡死,SSH都连不上服务器,不得不重启。但是我知道是我程序的问题。然后分析问题,解决问题。陆陆续续持续了一个多月,下面分享解决思路。一、定位造成内存溢出可能存

在的问题
  • io流操作文档没关闭流。
  • 往一个静态集合变量里一直压栈。
  • 连接没释放。
  • Java队列没消耗。
  • Ehcache缓存使用量过大。
  • 频繁IO操作大文件。
  • Session过期时间太久。
  • 等等.....
我定位有可能造成的原因是以上原因,针对本站的特点在做细排查,有可能出现 的问题。
  • io流操作文档没关闭流。(有可能)
  • 往一个静态集合变量里一直压栈。(没有这个问题)
  • 链接没释放。(有可能,因为本站有大量的HttpClient请求)
  • Java队列没消耗。(有可能,因为本站使用上了)
  • Ehcache缓存使用量过大。(没使用)
  • 频繁IO操作大文件。(没有)
  • Session过期时间太久。(可能有)
  • 等等.....
二、采用Memory Analyzer Tool(MAT)分析Java内存采用   jmap  命令(Java Memory Map)导出内存转储快照(Dump);首先查询到你对应的   Tomcat  的pidps -aux|grep xxx-tomcat然后执行jmap命令:jmap -dump:format=b,file=73630.hprof 16706导出完毕。down下来用   Eclipse  ,或者   MyEclipse  查看,但是 MyEclipse 或者 Eclipse 要先安装工具,自行百度。然后以openFile 的方式打开。如图:可能有点看不懂,自行解决,点击Histogram ,可以看到内存中的详细信息。可以看到char[] 、byte[] 占用的是最多,而且不是多一点点。这明显不正常。就是一些IO流相关的信息。Memory Analyzer 工具还是有很多功能的,我也不太会用。具体可以多看看相关的博客。下面来排查问题。三、问题逐一排查,由容易到复杂3.1 Session检查从配置文件web.xml 查看,发现   Session    超时配置了900 分钟。。。醉了,回想起来,是当时因为有权限校验(防止攻击)模块利用   Session  来实现,所以才出此下策。改成30 分钟,重启后效果有一点点。继续排查。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

首页

手机版|关于自己|运维技术分享平台

GMT+8, 2024-12-22 20:46 , Processed in 0.072125 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表