处理内存溢出,报OutOfMemoryError错误

  1. 通过jmap -histo命令查看系统内存使用情况

    1. jmap -histo [进程号]

    通过这个命令,我们可以看出当前哪个对象最消耗内存。
    上面这个运行结果是我启动了本地的一个项目,然后运行【jmap -histro 进程号】运行出来的结果,直接去了其中的一部分。通过这里我们可以看看大的实例对象中,有没有我们自定义的实例对象。通过这个可以排查出哪个实例对象引起的内存溢出。
    除此之外,Total汇总数据可以看出当前一共有多少个对象,暂用了多大内存空间。这里是有约860w个对象,占用约923M的空间。

  2. 分析内存溢出,查看堆空间占用情况

    1. jhsdb jmap --heap --pid 进程号
  3. 导出dump内存溢出的文件,导入到jvisualvm查看

    1. jmap -dump:file=a.dump 进程号

    然后导入到jvisualvm中进行分析,方法是:点击文件->装入,导入文件,查看系统的运行情况了。

CPU使用猛增,这个问题如何排查

  1. top命令查看cpu运行情况,【top -p 46518】按H,获取每个线程的内存情况
  2. 找到内存和cpu占用最高的线程tid
  3. 将线程tid转化为十六进制,执行[ jstack 4018360|grep -A 10 67187778] 查询飙高线程的堆栈信息
  4. 查看对应的堆栈信息找出可能存在问题的代码

进程有死锁,这个问题如何排查

  1. 通过Jstack命令来看看是否能检测到当前有死锁j stack 51789
  2. 使用jvisualvm查看死锁

JVM参数调优

垃圾回收统计 jstat -gc 进程id