java线上问题排查思路

167 阅读1分钟

1.cpu突然升高:

命令行排查:

top 查到各个进程使用cpu的情况

top -Hp  11345(java进程号码):输出java进程的各个线程的使用cpu情况

找到占用cpu最高的几个线程 ,记录下线程号并转换为16进制 

执行命令 jstack  11345(java进程号)|  grep  0x35bc(前面记录的线程号的16进制数)

找到可疑的线程栈进行排查

工具排查:

arthas安装(待学习)

2.GC频繁

dump文件的导出,VisualVM分析堆上对象的占用情况

可能的原因:

1.survivor区太小导致对象过早进入老年代

2.有大对象的分配直接进入老年代

3.有大量对象滞留在老年代一直无法回收

3.线程池异常排查:

死锁必要条件:

1. 互斥条件:一个资源每次只能被一个进程使用。

2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

4 线程状态:

新建(New)

运行(Runnable)Running和Ready

无限等待(Waiting):Object.wait(); Thread.join();LockSupport.park()

 限期等待(Time Waiting):sleep(时间);wait(时间);Thread.join(时间);LockSupport.parkNanos();LockSupport.parkUntil();

阻塞(Blocked):等待获取排他锁

结束(Dead):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期