一.线上服务器内存飙升怎么排查?
1.通过top命令查看cpu、内存占用情况
2.通过shift+m命令按内存占用排序查看哪个java进程占用内存高,获取pid
3.通过jmap -histo pid 打印当前所有对象个数(使用命令jamp -histo pid > log.txt 存储到文件中,下载命令sz log.txt),打开文件查看哪些类是自己包下的业务类,初步判断哪些类产生的对象多
4.通过jmap -heap pid查看堆的新生代、老年代的使用情况
5.通过jmap -dump:format:b,file=heap.hprof pid导出堆转储文件,在线上导出的的时候先把某台及其从负载均衡去掉,通过MAT或者jdk自带的visualVM分析文件
二.线上服务器cpu飙升怎么排查?
1.通过top/htop命令查看cpu、内存占用情况,获取cpu占用最高的pid
2.通过top -Hp pid命令查看cpu占用最高的线程tid
3.通过printf '%x' tid命令把tid字符型转成16进制整型输出,例如8ef
4.通过jstack pid打印栈信息,然会下载到本地文件
5.根据8ef在文件中搜索,找到打印的线程栈报错的java代码
线程状态:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。
BLOCKED,受阻塞并等待监视器锁。
WATING,无限期等待另一个线程执行特定操作。
TIMED_WATING,有时限的等待另一个线程的特定操作。
TERMINATED,已退出的。