服务器内存泄露 , 重启后恢复问题解决方案

 最近爆发了一个问题 , 以前一直在正常运行的应用突然无法访问 .

不用问,这个肯定是服务器的问题,但是这个要怎么看呢?

1.登录服务器,如果服务器压力过大,已经无法登录服务器了,那么只能请求DBA强制重启了.

  1.1. 假设能登陆服务器,马上查看服务器CPU以及内存或者回收等信息,可以那么使用以下方法收集日志和查看CPU,手速一定要快,比较用户都在催,电话,微信,qq都在响..收集完了就重启服务器,现正常了再查原因.

  附图:为了大家能够熟练敲打,照着多打吧.

  

2.登录之后查看回收效率以及速度:

  1.通过 ps -ef|grep java 得到pid:如图:

  

2.通过 ps -p 101040 -o etime;jstat -gcutil 101040 1000 30  

  上面的命令意思:

  ps -p 101040 -o etime 查看的是应用运行时长

  jstat -gcutil 为查看jvm gc回收情况的命令

  101040 为上图的PID

  1000为时间间隔,单位毫秒

  30为打印的条数,不设定则一直打印

至于打印什么东西??请看下面:

  

 结果中每个项目的含义可以参考官方对jstat的文档,简单翻译如下:(参考别人的翻译)

- S0C: Young Generation第一个survivor space的内存大小 (kB).
- S1C: Young Generation第二个survivor space的内存大小 (kB).
- S0U: Young Generation第一个Survivor space当前已使用的内存大小 (kB).
- S1U: Young Generation第二个Survivor space当前已经使用的内存大小 (kB).
- EC: Young Generation中eden space的内存大小 (kB).
- EU: Young Generation中Eden space当前已使用的内存大小 (kB).
- OC: Old Generation的内存大小 (kB).
- OU: Old Generation当前已使用的内存大小 (kB).
- PC: Permanent Generation的内存大小 (kB)
- PU: Permanent Generation当前已使用的内存大小 (kB).
- YGC: 从启动到采样时Young Generation GC的次数
- YGCT: 从启动到采样时Young Generation GC所用的时间 (s).
- FGC: 从启动到采样时Old Generation GC的次数.
- FGCT: 从启动到采样时Old Generation GC所用的时间 (s).
- GCT: 从启动到采样时GC所用的总时间 (s).

 

3.上面都是查看JVM的内存情况,具体表现为jvm内存泄露,解决方案现在有2个:

  1.具体问题具体分析,找到内存泄露的瓶颈,上面所搜集的日志可以帮助你找到问题的根源;

  2.短期内需要保证项目运行,那么请将JVM的内存加大,1G的加到2G,2G的加到4G等...

    调整方式(Tomcat为例,其他容器自行参考)

    1.打开文件:自己的tomcat目录/bin/catalina.sh

    2.找到如下参数,并将其修改为如下:

JAVA_OPTS="-server -Xms4096m -Xmx4096m"
JavaOpts里面的server参数足够用了,其余多余的参数其实没什么用(项目自行配置),将上面的内存大小调整即可,如上面为4096M=4G.

  调整内存只是权宜之计,根本问题还是要找到瓶颈,对症下药!!!

  祝大家永无bug.

    

原文地址:https://www.cnblogs.com/pongyc/p/9646433.html