内存泄露问题排查

一、 内存溢出和内存泄露

	a)	内存溢出:内存溢出是在内存一定的情况下,系统申请内存大于预设定内存;可以通过调整最大内存改善这种问题
	b)	内存泄露:是由于系统bug导致创建的对象无法正常回收,这种智能通过修改代码来处理这种问题

二、 排查案例

a) 查找进程ID

格式:jps [options] [hostId]
jps -l
ps -aux | grep xxx

三、 利用虚拟机统计信息监视工具:jstat 监视虚拟机各种运行状态。

格式:jstat命令格式
内存泄露问题排查_第1张图片

jstat [ option vmid [interval[s|ms] [count]] ]
jstat -gcutil pid 1000
每隔1000毫秒查询一次pid进程的状态
gcutil 已使用空间占总空间的百分比
S0、S1:两个survivor区
E:新生代Eden区
O:老年代
YGC:minor gc 次数
YGCT:YGC耗时
FGC:full gc
FGCT:full gc耗时
GCT:总耗时

四、 找出频繁GC的原因

a) 把堆dump下来,用MAT进行分析

b) 使用java内存影像工具jmap 格式:
jmap [option] pid
jmap -histo:live pid

内存泄露问题排查_第2张图片

五、 top下对当前服务器内存进行了解

内存泄露问题排查_第3张图片
注:shift+M按照内存占用进行排序

六、 指定项目输出GC日志

-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:gc.log 日志文件输出到当前文件

七、查看当前JVM使用的收集器

java -XX:+PrintCommandLineFlags -version

你可能感兴趣的:(JVM)