首先可以用jstack -l pid >sample.dump把java进程的运行栈dump出来。

还可以用grep java.lang.Thread.State sample.dump | awk '{print $2}' | sort -n | uniq -c 来看看进程中都有哪些线程状态。

-- ::
Full thread dump Java HotSpot(TM) -Bit Server VM (11.0.+-LTS mixed mode): Threads class SMR info:
_java_thread_list=0x00007f8209356340, length=, elements={
0x00007f8268174000, 0x00007f8268178000, 0x00007f826818a800, 0x00007f826818c800,
0x00007f826818f000, 0x00007f8268191000, 0x00007f826820f800, 0x00007f8268223000,
0x00007f8268011000, 0x00007f820817e000, 0x00007f8208180000, 0x00007f820830b800,
0x00007f8208409000, 0x00007f8208adc000, 0x00007f8208c08000, 0x00007f8208c48000,
0x00007f8208d24000, 0x00007f8208d25800, 0x00007f81c4466800, 0x00007f81c4469000,
0x00007f81c446a000, 0x00007f8208d0e800, 0x00007f81e001f800, 0x00007f81e0023000,
0x00007f821c040000, 0x00007f8238001800, 0x00007f820c1f2000, 0x00007f81d0004800,
0x00007f820928b000
} "Reference Handler" # daemon prio= os_prio= cpu=.09ms elapsed=.82s tid=0x00007f8268174000 nid=0x3f89
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0./Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@11.0./Reference.java:)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0./Reference.java:) Locked ownable synchronizers:
- None
...
...
"fsnotifier64" # prio= os_prio= cpu=.55ms elapsed=.56s tid=0x00007f81c4466800 nid=0x3fac in
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@11.0./Native Method)
- waiting on <0x00000000e3205e88> (a java.lang.ProcessImpl)
at java.lang.Object.wait(java.base@11.0./Object.java:)
at java.lang.ProcessImpl.waitFor(java.base@11.0./ProcessImpl.java:)
- waiting to re-lock in wait() <0x00000000e3205e88> (a java.lang.ProcessImpl)
at com.intellij.execution.process.ProcessWaitFor$$.run(ProcessWaitFor.java:)
at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:)
at com.intellij.execution.process.ProcessWaitFor$.run(ProcessWaitFor.java:)
at java.util.concurrent.Executors$RunnableAdapter.call(java.base@11.0./Executors.java:)
at java.util.concurrent.FutureTask.run(java.base@11.0./FutureTask.java:)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0./ThreadPoolExecutor.java:)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0./ThreadPoolExecutor.java:)
at java.lang.Thread.run(java.base@11.0./Thread.java:) Locked ownable synchronizers:
- <0x00000000e3205f78> (a java.util.concurrent.ThreadPoolExecutor$Worker)

首先第一行显示的是dump的时间,第二行是虚拟机的一些信息,接着就是线程的list,包括每个线程的tid。

紧接着就是最重要的线程栈了:

"Reference Handler":是线程的名字

#2不知道是啥,估计是线程列表中的的第几个线程?

daemon说明是守护线程

prio=10 os_prio=0 cpu=15.09ms elapsed=19776.82s 分别是线程jvm优先级,线程操作系统优先级,cpu运行时间,实际运行时间。

tid, Java memory address of its internal Thread control structure.16进制的

nid, native thread id. 每一个nid对应于linux下的一个tid, 即lwp  (light weight process, or thread).16进制的,转到10进制后可以用ps命令找到它。

waiting on condition [0x00007f8248f2b000]  以及另一个线程的 Object.wait() [0x00007f81e41ac000]  线程运行到哪了,可以理解为线程pc计数器的位置。

然后就是线程的状态。这个一般都是重点,可以看下《学会查看jstack Dump 日志》,或者网上搜下怎么看jstack日志中的线程状态。

接着就是线程栈了,在线程栈中还会列出所之类的(以横杆-打头的)。

最后是Locked ownable synchronizers。

需要注意的是,一个java进程中,还有许多自带的线程比如gc线程啥的,所以你的单线程java可能也会有好多个线程dump出来,关于自带的内部线程,参见《JVM内部运行线程介绍》一文。

参考:《三个实例演示 Java Thread Dump 日志分析

虚拟机stack全分析

jstack 结果查看的更多相关文章

  1. jstack工具查看系统线程问题

    背景: 最近在做项目系统的异常测试,项目依赖于nkv,需要模拟依赖组件nkv异常时系统的响应及性能情况.通过tc工具模拟当服务器发送到nkv的请求超时时系统的响应.发现接口返回错误率100%,查看服务 ...

  2. java命令--jstack 工具 查看JVM堆栈信息

    介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项" ...

  3. 【java】jstack分析查看线程状态

    演示代码 public class StackTest { public static void main(String[] args) { Thread thread = new Thread(ne ...

  4. 使用jstack命令查看CPU高占用的问题记录

    笔记: 1.top命令找出最高占用的进程(command为java) 2.查看高负载进程下的高负载线程:top -Hp [PID] (或 ps -mp PID -o THREAD,tid,time) ...

  5. jstack查看Java堆栈信息

    命令 jps 查看进程id jstack 1234 查看该进程的线程堆栈信息 对于每个线程,都有如下信息: 线程名,如“main”线程属性(如果是Daemon线程,会有Daemon标识,否则,什么都没 ...

  6. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole.大名鼎 ...

  7. 三、jdk工具之jstack(Java Stack Trace)

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  8. jstack(Stack Trace for Java)

    功能   用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件).线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间 ...

  9. JVM性能监控与故障处理命令汇总(jps、jstat、jinfo、jmap、jhat、jstack)

    给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具才是运用知识处理数据的手段 使用适当的虚拟机监控和分析的工具可以加快我们分析数据.定位解决问题的速度,本文主要介绍了几款服 务器上常用的 ...

随机推荐

  1. mysql 数据库或者表空间使用查询

    直接上语句 查所有数据库占用空间大小 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB') as data ...

  2. CSharp读取json配置文件内容

    步骤 读取配置文件转换成字符串,代码如下 string contents = System.IO.File.ReadAllText("config.json"); 注意:该语句会抛 ...

  3. 使用echarts绘制漂亮的渐变键盘仪表盘

    echarts官方示例和默认样式都比较难看,经过一顿捣鼓实现比较漂亮的渐变仪表盘. 第一步:设置轴线 将图表轴线.label.分割线.隐藏,只保留刻度,然后修改刻度样式达到最终效果.不过要注意的是ax ...

  4. iOS开发网络篇—GET请求和POST请求的说明与比较

    1.GET请求和POST请求简单说明 1.1 创建GET请求 // 1.设置请求路径 NSString *urlStr = [NSString stringWithFormat:@"http ...

  5. “全栈2019”Java第九十四章:局部内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. 记一名软件实施自学转Java开发,附学习计划

    2015年毕业到现在已经3年了,而我转型开发已经有一年的时间了.写这篇文章除了记录,主要还是想分享一些经历给想要转型开发的同学们,不要走那些我走过的弯路. 2015年入职了第一家公司,当时是做的分销系 ...

  7. jmeter我们必须搞清楚的问题

    我们从以下几个点来看jmeter: 1.jmeter是什么? 2.jmeter为什么我们要使用jmeter?他可以帮我们解决那些事情? 3.怎样使用jmeter做这些事情? 4.我们在什么时候会使用j ...

  8. 架构师养成记--31.Redis的几种类型

    String类型 Redis一共分为五种基本数据类型:String.Hash.List.Set.ZSet String类型是包含很多张类型的特殊类型,并且是二进制安全的.比如对序列化的对象进行存储,比 ...

  9. 使用Chrome-headless模式下,截屏不全屏的问题

    在headless模式下,是没有打开浏览器窗口的,那么driver.maximize_window(),找不到目标也打不开. 我们可以换一种方式,去在无头模式下,指定浏览器的窗口大小运行即可. __o ...

  10. fd与FILE结构体

    文件描述符 fd 概念:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件 ...