linux服务器下CPU爆满
top -c
使用top发现进程64690 CPU占用过高超过200% 可使用 toc -c 查看具体进程明细 按1可查看cpu详情
top -H -p PID
top -H -p 64690
发现进程64690下的其中一个线程64736 CPU占用异常高
线程PID转换十六进制
printf “%x\n” 64637
获取到进程64637的十六进制码值(字母小写): fce0
jstack打印堆栈信息
进入到jdk安装目录下 /opt/jdk1.8.0_11/bin
使用./jstack 64690 | grep "fce0" -A 50
可在打印出来的堆栈信息中找到对应的异常代码
也可直接打印进程堆栈信息
jstack -l 64690
生成堆栈快照文件
-- 查看线程数
ps -eLf|wc -l
1.手动生成
jstack 64690 > jstack.hprof
或
jstack 64690 > jstack.log
2.自动生成:
-XX:+HeapDumpOnOutOfMemoryError
当OutOfMemoryError发生时自动生成 Heap Dump 文件。
这是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在OOM(OutOfMemoryError)发生时。
-XX:+HeapDumpBeforeFullGC
当 JVM 执行 FullGC 前执行 dump。
-XX:+HeapDumpAfterFullGC
当 JVM 执行 FullGC 后执行 dump。
-XX:+HeapDumpOnCtrlBreak
交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。
-XX:HeapDumpPath=d:\test.hprof
指定 dump 文件存储路径。
注意:JVM 生成 Heap Dump 的时候,虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。
线程状态
1.死锁:Deadlock(重点关注)
2.执行中: Runnable
3.等待资源: Waiting on condition(重点关注,等到什么资源)
4.等待获取监视器: Waiting on monitor entry(重点关注)
5.暂停: Suspended
6.对象等待中: Object.wait() 或者 TIMED_WAITING
7.堵塞: Blocked(重点关注)
8.停止: Parked
1、NEW
线程刚刚被创建,也就是已经new过了,但是还没有调用start()方法,jstack命令不会列出处于此状态的线程信息
2、RUNNABLE #java.lang.Thread.State: RUNNABLE
RUNNABLE这个名字很具有欺骗性,很容易让人误以为处于这个状态的线程正在运行。事实上,这个状态只是表示,线程是可运行的。我们已经无数次提到过,一个单核CPU在同一时刻,只能运行一个线程。
3、BLOCKED # java.lang.Thread.State: BLOCKED (on object monitor)
线程处于阻塞状态,正在等待一个monitor lock。通常情况下,是因为本线程与其他线程公用了一个锁。其他在线程正在使用这个锁进入某个synchronized同步方法块或者方法,而本线程进入这个同步代码块也需要这个锁,最终导致本线程处于阻塞状态。
4、WAITING
等待状态,调用以下方法可能会导致一个线程处于等待状态:
Object.wait 不指定超时时间 # java.lang.Thread.State: WAITING (on object monitor)
Thread.join with no timeout
LockSupport.park #java.lang.Thread.State: WAITING (parking)
例如:对于wait()方法,一个线程处于等待状态,通常是在等待其他线程完成某个操作。本线程调用某个对象的wait()方法,其他线程处于完成之后,调用同一个对象的notify或者notifyAll()方法。Object.wait()方法只能够在同步代码块中调用。调用了wait()方法后,会释放锁。
5、TIMED_WAITING
线程等待指定的时间,对于以下方法的调用,可能会导致线程处于这个状态:
Thread.sleep #java.lang.Thread.State: TIMED_WAITING (sleeping)
Object.wait 指定超时时间 #java.lang.Thread.State: TIMED_WAITING (on object monitor)
Thread.join with timeout
LockSupport.parkNanos #java.lang.Thread.State: TIMED_WAITING (parking)
LockSupport.parkUntil #java.lang.Thread.State: TIMED_WAITING (parking)
6、TERMINATED
线程终止。
查看占用内存较多的前30名java对象 jmap -histo:live 【pid】 | head -30