JVM大家可能都知道是个什么玩意-Java虚拟机,但是到底是个什么鬼?相信即使工作3-5年的程序员可能也不大了解。
如题所述,今天与大家分享的是如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题。线程堆栈分析尽管不是初学者一门必备的技术,但是对于自身走向高程来说应该是必备的傍身技能。
哎…内存又溢出了,唉…?怎么突然CPU200%了等等一系列的问题都需要从线程堆栈中存储的信息找到问题所在。
JVM 线程堆栈
首先我们了解一下JVM 线程堆栈——它是什么?
JVM线程堆栈是一个给定时间的快照,它能向你提供所有被创建出来的Java线程的完整清单.
每一个被发现的Java线程都会给你如下信息:
– 线程的名称;经常被中间件厂商用来识别线程的标识,一般还会带上被分配的线程池名称以及状态 (运行,阻塞等等.)
– 线程类型 & 优先级,例如 : daemon prio=3 中间件程序一般以后台守护的形式创建他们的线程,这意味着这些线程是在后台运行的;它们会向它们的用户提供服务,例如:Java EE应用程序
– Java线程ID,例如 : tid=0x000000011e52a800 这是通过 java.lang.Thread.getId()
获得的Java线程ID,它常常用自增长的长整形 1…n 实现
– 原生线程ID,例如 : nid=0x251c ,原生线程ID可以让你获得诸如从操作系统的角度来看那个线程在你的JVM中使用了大部分的CPU时间等这样的相关信息
– Java线程状态和详细信息,例如: waiting for monitor entry [0xfffffffea5afb000] java.lang.Thread