基本术语解释:
内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,就会出现out of memory;内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。(程序运行时所需要的内存,超出了它可用的最大内存。)
内存泄露(memory leak):是指程序在申请内存后,无法释放已申请的内存空间。
memory leak会最终会导致out of memory
cpu过高/内存使用持续上升分析
在处理压力测试问题的时候,经常遇到OOM的情况,这时候我们需要去记录内存实时的情况,一般会打出一个dump文件,然后使用内存分析工具去查看哪些对象一直占用了大量内存,最终分析出代码需要优化的地方。
Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。
dump文件记录了JVM运行期间的内存占用、线程执行等情况。常用的dump文件有heap dump和thread dump(也叫javacore,或java dump)。
heap dump记录内存信息的,thread dump是记录CPU信息的。
Java用如下命令打出dump文件:
jmap -dump:format=b,file=/path/heap.bin 进程ID #所有线程的状态都有,全部都统计
jmap -dump:live,format=b,file=/path/heap.bin 进程ID #live的选项,实际上是产生一次Full GC来保证只看还存活的对象。
live表示我们需要抓取目前在生命周期内的内存对象,也就是说GC收不走的对象,然后我们绝大部分情况下,需要的看就是这些内存。而且会减小dump文件的大小。(慎用,因为这个命令会将没有回收的内存手动回收一次,只留下不会被回收的。)
#zhongyong使用的
jmap -dump:format=b,file=20170307.dump 57776 #20170307.dump生成的dump文件,57776pid,生成的文件在对应服务路径下面
strings filename #转成string就可以直接查看详情
在cmd下,输入:java -verbose 查看jdk所在路径,可以用自带的jvisualvm查看内存的使用情况,查看dump文件
CPU突然变高,分析问题步骤:
1.通过top命令,可以确认下,到底是哪个进程导致CPU变高,top
2.使用top -Hp pid来对该进程下的线程进行观察。展示的pid就是对应的线程了。
3.jstack查找这个线程的信息
jstack [进程]|grep -A 10 [线程的16进制]
即: jstack 12920|grep -A 10 2600
通过该命令可以查找到当前线程的状态
常见线程描述:
wait on monitor entry: 被阻塞的,这种情况是有问题的
runnable : 注意IO线程
in Object.wait(): 注意非线程池等待
以上总结是基于网上查询资料汇总所得,如有雷同,请自行理解本文为转载自雷同文件