栈内存分析

1、基本概念

线程堆栈也称线程调用堆栈,是虚拟机中线程(包括锁)状态的一个瞬间状态的快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况。

打印出的线程堆栈的信息包括内容:

1)线程名字,id,线程的数量等;

2)线程的运行状态,锁的状态(锁被哪个线程持有,哪个线程在等待锁等);

3)调用堆栈(即函数的调用层次关系)调用堆栈包含完整的类名,所执行的方法,源代码的行数;

jstack 2593 > 2.txt,参数详细解释如下图:

栈内存分析_第1张图片

栈内存分析_第2张图片

 

2、线程作用

线程栈是瞬时快照包含线程状态以及调用关系,所以借助堆栈信息可以帮助分析很多问题,比如线程死锁,锁争用,死循环,识别耗时操作等等。

1)cpu过高

2)系统挂起,无响应

3)线程死锁,死循环

4)内存溢出

5)系统运行越来越慢

6)性能瓶颈(如无法充分利用cpu等)

 

3、线程栈状态

1)NEW:线程刚刚被创建,在线程栈中基本看不到这个状态;

2)RUNNABLE:初始化之后的一个状态;

* 线程正在正常运行中,也有肯在耗时计算/IO等待/CPU时间片切换等

* 处于RUNNABLE状态的线程不一定会消耗cpu

3)BLOCKED/monitor:锁的状态,三角恋会产生死锁;

4)WAITING:无限等待,不到黄河不死心

5)TIMED_WAITING:等待一定时间,超时后不等了;

6)TERMINATED:线程终止,在线程栈中基本看不到;

栈内存分析_第3张图片

 

4、CPU消耗情况

处于timed_waiting/waiting状态的线程一定不消耗cpu,block状态消耗CPU但消耗不多,处于runnable状态的线程不一定会消耗cpu,要结合当前线程代码的性质判断,是否消耗cpu

如果是纯java运算代码,则消耗cpu

如果线程处于网络io,很少消耗cpu

如果是本地代码,通过查看代码,可以通过pstack获取本地的线程堆栈,如果是纯运算代码,则消耗cpu,如果被挂起,则不消耗,如果是io,则不怎么消耗cpu。

栈内存分析_第4张图片

更多内容欢迎关注微信公众号查看

你可能感兴趣的:(jvm)