前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK14性能管理工具:jstack使用介绍

JDK14性能管理工具:jstack使用介绍

作者头像
程序那些事
发布2020-07-08 10:04:52
7540
发布2020-07-08 10:04:52
举报
文章被收录于专栏:程序那些事程序那些事

简介

在之前的文章中,我们介绍了JDK14中jstat工具的使用,本文我们再深入探讨一下jstack工具的使用。

jstack工具主要用来打印java堆栈信息,主要是java的class名字,方法名,字节码索引,行数等信息。

jstack的命令格式

jstack的参数比较简单,l可以包含锁的信息,e包含了额外的信息。

jstack的使用

我们举个例子:

jstack -l -e 53528

输出结果如下:

输出的结果我们可以分为下面几个部分:

JVM虚拟机信息

第一部分是JVM虚拟机的信息

2020-05-09 21:46:51Full thread dump Java HotSpot(TM) 64-Bit Server VM (14.0.1+7 mixed mode, sharing):

上面显示了虚拟机的thread dump时间和虚拟机的版本等信息。

Threads class SMR info

第二部分是JVM中非JVM(非VM和非GC的线程)的内部线程信息。

这些elements是和后面线程的tid相匹配的。表示的是本地线程对象的地址,注意这些不是线程的ID。

大家可能注意到了里面写的是SMR, SMR全称是Safe Memory Reclamation。

什么是SMR呢?简单点讲就是安全的内存分配,一般这个问题会出现在非自动GC的编程语言中如C++。在这些语言中,需要自己来为对象分配内存和销毁对象,这样就可能导致在多线程的环境中,一个地址可能被分配给了多个对象,从而出现了内存分配的不安全。

线程信息

第三部分就是线程的具体信息了:

按照字段的顺序,我们可以把线程信息分为下面几个部分:

  • 线程名字:例如Reference Handler
  • 线程的ID:例如#2
  • 是否守护线程:例如daemon,daemon threads是低优先级的thread,它的作用是为User Thread提供服务。因为daemon threads的低优先级,并且仅为user thread提供服务,所以当所有的user thread都结束之后,JVM会自动退出,不管是否还有daemon threads在运行中。
  • 优先级:例如prio=10
  • OS线程的优先级:例如os_prio=31
  • cpu时间:线程获得CPU的时间,例如cpu=0.67ms
  • elapsed:线程启动后经过的wall clock time
  • allocated:本线程分配的分配的bytes数
  • defined_classes:本线程定义的class个数 注意’allocated=’ 和 ‘defined_classes=’ 必须要开启 -XX:+PrintExtendedThreadInfo才会输出数据。
  • Address:java线程的地址,例如:tid=0x00007fda04811000
  • OS线程ID:例如nid=0x4603
  • 线程状态:例如waiting on condition
  • 最新的Java堆栈指针:最新的java堆栈指针SP,例如:[0x000070000afe1000]

Thread Stack Trace

接下来就是线程的堆栈信息:

上面的例子是线程的堆栈信息,并且列出来了线程的状态。

Locked Ownable Synchronizer

接下来的部分是该线程拥有的,可用的用于同步的排它锁对象。

Ownable Synchronizer是一个同步器,这个同步器的同步属性是通过使用AbstractOwnableSynchronizer或者它的子类来实现的。

例如ReentrantLock和ReentrantReadWriteLock中的write-lock(注意不是read-lock,因为需要排它性)就是两个例子。

JVM Threads

接下来是JVM的线程信息,因为这个线程是JVM内部的,所以没有线程ID:

最后一部分是JNI(Java Native Interface)引用的信息,注意这些引用可能会导致内存泄露,因为这些native的引用并不会被自动垃圾回收。

JNI global refs: 43, weak refs: 45

总结

jstack是分析线程的非常强大的工具,希望大家能够使用起来。

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/jdk14-jvm-jstack/

本文来源:flydean的博客

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档