1.栈内存溢出
- StackOverflowError:当线程请求的栈的深度大于虚拟机所允许的最大深度,则抛出StackOverflowError,简单理解就是虚拟机栈中的栈帧过多(一个线程嵌套调用的方法数量过多)时,就会抛出StackOverflowError异常。最常见的场景就是方法无限递归调用。
- OutOfMemoryError:如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出
OutOfMemoryError。
2.线程运行诊断
案例一 CPU占用过高
定位:
- 用 top 命令定位那个线程对CPU的占用过高
- ps H -eo pid,tid,%cpu | grep
进程id(用ps命令进一步定位是哪个线程引起的CPU占用过高) - jstack 进程id 可以根据线程 id 找到有问题的线程,进一步定位到问题代码的源码行号(线程编号为十进制,要转换十六进制来查找线程)
案例2:程序运行很长时间没有结果(可能是线程死锁)
定位: