java jstack使用_jstack命令的使用
文章来源:https://blog.csdn.net/wufaliang003/article/details/80414267
jstack是java虚拟机自带的一种堆栈跟踪工具。
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,
如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者
等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程
序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung
的状态,jstack是非常有用的。
jstack命令:
Usage:
jstack [-l] (to connect to running process)
jstack-F [-m] [-l] (to connect to a hung process)
jstack [-m] [-l] (to connect to a core file)
jstack [-m] [-l] [server_id@](to connect to a remote debug server)
Options:-F to force a thread dump. Use when jstack does not respond (process ishung)-m to print both java and native frames (mixed mode)-l longlisting. Prints additional information about locks-h or -help to print this help message
-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack,一般情况不需要使用
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多
(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用
-m 打印java和native c/c++ 框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
执行命令:
jstack -m 12905
Attaching to process ID 12905, please wait...
Debugger attached successfully.
Server compiler detected.
JVM versionis 24.71-b01
Deadlock Detection:
No deadlocks found.----------------- 12908 -----------------
0x000000358d40b63c __pthread_cond_wait + 0xcc
0x00007fcad07875a5 Unsafe_Park + 0x125
0x00007fcacc4b17f8 * sun.misc.Unsafe.park(boolean, long) bci:0(Interpreted frame)0x00007fcacc4a5058 * java.util.concurrent.locks.LockSupport.park(java.lang.Object) bci:14 line:186(Interpreted frame)0x00007fcacc4a5058 * java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt() bci:1 line:834(Interpreted frame)0x00007fcacc4a5350 * java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(int) bci:72 line:994(Interpreted frame)0x00007fcacc4a5058 * java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(int) bci:24 line:1303 (Interpreted frame)
线程状态
想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态,下面这些状态是我们使用jstack命令查看线程堆栈信息时可能会看到的线程的几种状态:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。
BLOCKED,受阻塞并等待监视器锁。
WATING,无限期等待另一个线程执行特定操作。
TIMED_WATING,有时限的等待另一个线程的特定操作。
TERMINATED,已退出的。
Monitor
在多线程的 JAVA程序中,实现线程之间的同步,就要说说 Monitor。 Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,
也仅有一个 monitor。下 面这个图,描述了线程和 Monitor之间关系,以 及线程的状态转换图:
进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁。如果对象未被锁住,则迚入拥有者;否则则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。
拥有者(The Owner):表示某一线程成功竞争到对象锁。
等待区(Wait Set):表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒。
从图中可以看出,一个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”
和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。
先看 “Entry Set”里面的线程。我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set”队列。
java jstack使用_jstack命令的使用相关推荐
- java jstack使用_jstack命令详解
jstack命令可以用来查看运行的Java进程下,多线程的运行情况,语句如"[root@admin ~]# jstack 43616 Full thread dump Java HotSpo ...
- java jstack 工具_java命令之jstack工具
1.总述 jstack是jvm虚拟机自带的一种堆栈分析工具,用于打印出给定的java进程或者core file或者远程调试服务的堆栈信息等.主要分为两个功能如下: a.针对活着的进程做本地的或者远程的 ...
- java jstack 分析_jstack 分析一下java程序
感觉写的非常不错 前言 如果有一天,你的Java程序长时间停顿,也许是它病了,需要用jstack拍个片子分析分析,才能诊断具体什么病症,是死锁综合征,还是死循环等其他病症,本文我们一起来学习jstac ...
- Java开发常用Linux命令
1.查找文件 find / -name filename.txt根据名称查找/目录下的filename.txt文件. find . -name "*.xml"递归查找所有的xml文 ...
- centos java yum_CentOS7 使用yum命令安装Java SDK
CentOS 6.X 和 7.X 自带有OpenJDK runtime environment (openjdk).它是一个在linux上实现开源的Java 平台. 安装方式: 1.输入以下命令,以 ...
- Java程序执行Linux命令
java程序中要执行linux命令主要依赖2个类:Process和Runtime 首先看一下Process类: [plain] view plaincopyprint? ProcessBuilder. ...
- java -XX:+PrintFlagsInitial该命令可以查看所有JVM参数启动的初始值
java -XX:+PrintFlagsInitial 该命令可以查看所有JVM参数启动的初始值 [Global flags]intx ActiveProcessorCount = -1 {produ ...
- jenkins java反序列化_Jenkins “Java 反序列化”过程远程命令执行漏洞
###漏洞原理 反序列化是指特定语言中将传递的对象序列化数据重新恢复为实例对象的过程,而在这个过程中会执行一系列的字节流解析和对象实例化操作用于恢复之前序列化时的对象.在原博文所提到的那些 Java ...
- linux钟java运行命令,在java中运行linux命令
我想在java中运行"ls"命令,我的代码是- 注意: - 我正在使用WINDOWS.在java中运行linux命令 import java.io.IOException; pub ...
最新文章
- OpenXava 4.6.1 发布,Web 快速开发套件
- 第四章 菜单、工具栏和状态栏(第8课)
- mysql pdo 预处理_哪些方法用于实现pdo的预处理语句?
- C#各版本新增加功能
- 移动Web应用程序开发HTML5篇
- 企业实战_10_MyCat Mysql 主复制总结
- AGG第四十四课 渲染问题:绘制较宽轮廓和尖锐边缘
- 数据结构(java版)学习笔记(二)——线性表之顺序表
- bsh.jar/beanshell下载链接
- ios 线条球_画线弹球球游戏下载|画线弹球球ios版下载v1.0.2-乐游网IOS频道
- FutureTask.get(timeOut)执行原理浅析
- 微信小程序自定义函数返回值
- 19年1月底得一些装机心得(一)
- 虚拟机的显示屏幕修改大小
- 标准解读系列之三:智慧高速建设需要什么样的技术架构?
- CloudsBombs
- JQuery动画+事例
- CodeWarrior相关概述
- 模拟自由落体运动的小球
- Web GIS 地图投影与坐标系的研究与总结