处理内存溢出,报OutOfMemoryError错误
通过jmap -histo命令查看系统内存使用情况
jmap -histo [进程号]
通过这个命令,我们可以看出当前哪个对象最消耗内存。
上面这个运行结果是我启动了本地的一个项目,然后运行【jmap -histro 进程号】运行出来的结果,直接去了其中的一部分。通过这里我们可以看看大的实例对象中,有没有我们自定义的实例对象。通过这个可以排查出哪个实例对象引起的内存溢出。
除此之外,Total汇总数据可以看出当前一共有多少个对象,暂用了多大内存空间。这里是有约860w个对象,占用约923M的空间。分析内存溢出,查看堆空间占用情况
jhsdb jmap --heap --pid 进程号
导出dump内存溢出的文件,导入到jvisualvm查看
jmap -dump:file=a.dump 进程号
然后导入到jvisualvm中进行分析,方法是:点击文件->装入,导入文件,查看系统的运行情况了。
CPU使用猛增,这个问题如何排查
- top命令查看cpu运行情况,【top -p 46518】按H,获取每个线程的内存情况
- 找到内存和cpu占用最高的线程tid
- 将线程tid转化为十六进制,执行[ jstack 4018360|grep -A 10 67187778] 查询飙高线程的堆栈信息
- 查看对应的堆栈信息找出可能存在问题的代码
进程有死锁,这个问题如何排查
- 通过Jstack命令来看看是否能检测到当前有死锁j
stack 51789
- 使用jvisualvm查看死锁
JVM参数调优
垃圾回收统计 jstat -gc 进程id