栈内存分析

1、基本概念

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

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

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

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

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

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

 

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:线程终止,在线程栈中基本看不到;

 

4、CPU消耗情况

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值