Java命令:jstack — 获取线程dump信息

目录

  • 一、命令介绍
  • 二、使用实例
    • 实例一:jstack查看输出
    • 实例二:jstack统计线程数
    • 实例三:jstack检测死锁
    • 实例四:jstack检测CPU高

一、命令介绍

Usage:jstack [-l] <pid>(to connect to running process)  //连接活动线程jstack -F [-m] [-l] <pid>(to connect to a hung process)  //连接阻塞线程jstack [-m] [-l] <executable> <core>(to connect to a core file)  //连接dump的文件jstack [-m] [-l] [server_id@]<remote server IP or hostname>(to connect to a remote debug server)  //连接远程服务器Options:-F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)-m  to print both java and native frames (mixed mode)-l  long listing. Prints additional information about locks-h or -help to print this help message

二、使用实例

要使用jstack命令,首先我们要先找到要查看的进程ID,命令如下:

$ ps -ef | grep --color "com.javaagent.Main"

结果如下:
在这里插入图片描述
红框中即为进程ID。

实例一:jstack查看输出

命令如下:

$ jstack -l 69239

输出结果:

$ jstack -l 692392020-03-03 15:16:07
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.121-b13 mixed mode):"Attach Listener" #13 daemon prio=9 os_prio=31 tid=0x00007f9242141000 nid=0x5707 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLELocked ownable synchronizers:- None"ThreadTest" #11 prio=5 os_prio=31 tid=0x00007f9242140800 nid=0x5503 waiting on condition [0x00007000013d2000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at com.javaagent.Main$2.run(Main.java:64)at java.lang.Thread.run(Thread.java:745)Locked ownable synchronizers:- None..."ThreadTest_2" #10 prio=5 os_prio=31 tid=0x00007f9242100000 nid=0x5303 in Object.wait() [0x00007000012cf000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x0000000795856e18> (a java.lang.Object)at java.lang.Object.wait(Object.java:502)at com.javaagent.Main$1.run(Main.java:41)- locked <0x0000000795856e18> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)Locked ownable synchronizers:- None"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007f9242004000 nid=0x3003 in Object.wait() [0x000070000092e000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x0000000795588ec8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)- locked <0x0000000795588ec8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)Locked ownable synchronizers:- None"VM Thread" os_prio=31 tid=0x00007f9243841800 nid=0x2c03 runnable "GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007f9243810800 nid=0x2403 runnable "GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007f9243811000 nid=0x2603 runnable "GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007f9243811800 nid=0x2803 runnable "GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007f9243812800 nid=0x2a03 runnable "VM Periodic Task Thread" os_prio=31 tid=0x00007f9243805000 nid=0x4d03 waiting on condition JNI global references: 25

实例二:jstack统计线程数

命令如下:

$ jstack -l 69239 | grep 'java.lang.Thread.State' | wc -l

输出结果:

12

实例三:jstack检测死锁

死锁代码:

package com.javaagent.thread;public class DieThread implements Runnable {public static Object obj1=new Object();public static Object obj2=new Object();private boolean flag;public DieThread(boolean bl){flag = bl;}@Overridepublic void run() {if(flag) {while(true) {synchronized(obj1) {System.out.println(Thread.currentThread().getName()+"....if...obj1...");synchronized(obj2) {System.out.println(Thread.currentThread().getName()+".....if.....obj2.....");}}}}else {while(true){synchronized(obj2) {System.out.println(Thread.currentThread().getName()+"....else...obj2...");synchronized(obj1) {System.out.println(Thread.currentThread().getName()+".....else.....obj1.....");}}}}}
}public class Main {public static void main(String[] args){DieThread d1=new DieThread(true);DieThread d2=new DieThread(false);final Thread t1 = new Thread(d1);final Thread t2 = new Thread(d2);t1.setName("DieThread_1");t2.setName("DieThread_2");t1.start();t2.start();}
}

命令如下:

$ jstack -l 69239

死锁日志:

"DieThread_2" #11 prio=5 os_prio=31 tid=0x00007fc761896000 nid=0x5503 waiting for monitor entry [0x000070000134f000]java.lang.Thread.State: BLOCKED (on object monitor)at com.javaagent.thread.DieThread.run(DieThread.java:32)- waiting to lock <0x000000079586a768> (a java.lang.Object)- locked <0x000000079586a778> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)Locked ownable synchronizers:- None"DieThread_1" #10 prio=5 os_prio=31 tid=0x00007fc7610dd800 nid=0x5307 waiting for monitor entry [0x000070000124c000]java.lang.Thread.State: BLOCKED (on object monitor)at com.javaagent.thread.DieThread.run(DieThread.java:21)- waiting to lock <0x000000079586a778> (a java.lang.Object)- locked <0x000000079586a768> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)Locked ownable synchronizers:- NoneFound one Java-level deadlock:
=============================
"DieThread_2":waiting to lock monitor 0x00007fc7620421f8 (object 0x000000079586a768, a java.lang.Object),which is held by "DieThread_1"
"DieThread_1":waiting to lock monitor 0x00007fc762042358 (object 0x000000079586a778, a java.lang.Object),which is held by "DieThread_2"Java stack information for the threads listed above:
===================================================
"DieThread_2":at com.javaagent.thread.DieThread.run(DieThread.java:32)- waiting to lock <0x000000079586a768> (a java.lang.Object)- locked <0x000000079586a778> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)
"DieThread_1":at com.javaagent.thread.DieThread.run(DieThread.java:21)- waiting to lock <0x000000079586a778> (a java.lang.Object)- locked <0x000000079586a768> (a java.lang.Object)at java.lang.Thread.run(Thread.java:745)Found 1 deadlock.

实例四:jstack检测CPU高

步骤一:查看cpu占用高进程

输入命令:

$ top

输出结果:

top - 07:50:58 up 53 days, 23:38,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 113 total,   1 running, 112 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   7771904k total,  1770024k used,  6001880k free,   160496k buffers
Swap:  1048572k total,        0k used,  1048572k free,   844572k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    9075 root      20   0 19468 1540 1116 R  0.7  0.0   0:00.02 top                                                         1177 root      20   0  240m 4252 1688 S  0.3  0.1 176:47.24 oneagentwatchdo                                             1546 zabbix    20   0 81212 1616  728 S  0.3  0.0  28:12.55 zabbix_agentd                                               4433 root      20   0 4495m 566m  14m S  0.3  7.5  61:48.80 java                                                        1 root      20   0 23804 1772 1364 S  0.0  0.0   0:00.82 init                                                        2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                    3 root      RT   0     0    0    0 S  0.0  0.0   0:03.89 migration/0                                                 4 root      20   0     0    0    0 S  0.0  0.0   0:16.97 ksoftirqd/0

步骤二:查看cpu占用高线程

输入命令:

$ top -H -p 4433

输出结果:

top - 07:52:22 up 53 days, 23:40,  2 users,  load average: 0.08, 0.02, 0.01
Tasks:  62 total,   0 running,  62 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.1%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   7771904k total,  1770296k used,  6001608k free,   160496k buffers
Swap:  1048572k total,        0k used,  1048572k free,   844576k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    4433 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.00 java                                                        4434 root      20   0 4495m 566m  14m S  0.0  7.5   0:09.75 java                                                        4435 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.99 java                                                        4436 root      20   0 4495m 566m  14m S  0.0  7.5   0:01.00 java                                                        4437 root      20   0 4495m 566m  14m S  0.0  7.5   2:10.19 java                                                        4438 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.08 java                                                        4439 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.07 java                                                        4440 root      20   0 4495m 566m  14m S  0.0  7.5   0:00.00 java                                                        4441 root      20   0 4495m 566m  14m S  0.0  7.5   0:06.90 java                                                        4446 root      20   0 4495m 566m  14m S  0.0  7.5   1:10.37 java                                                        4447 root      20   0 4495m 566m  14m S  0.0  7.5   0:04.77 java                                                        4448 root      20   0 4495m 566m  14m S  0.0  7.5   0:56.77 java

步骤三:转换线程ID

printf "%x\n" 4434  //转换成16进制

输出结果:

1152   //16进制

步骤四:定位cpu占用线程

输入命令:

$ jstack 4433 | grep 1152 -A 30

说明:

  • 4433:进程ID;
  • 1152:线程16进制ID;

输出结果:

"main" #1 prio=5 os_prio=0 tid=0x00007f3b5c00b800 nid=0x1152 runnable [0x00007f3b61c8d000]java.lang.Thread.State: RUNNABLEat java.net.PlainSocketImpl.socketAccept(Native Method)at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)at java.net.ServerSocket.implAccept(ServerSocket.java:545)at java.net.ServerSocket.accept(ServerSocket.java:513)at org.apache.catalina.core.StandardServer.await(StandardServer.java:470)at org.apache.catalina.startup.Catalina.await(Catalina.java:793)at org.apache.catalina.startup.Catalina.start(Catalina.java:739)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)"VM Thread" os_prio=0 tid=0x00007f3b5c0fc000 nid=0x1155 runnable "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f3b5c020800 nid=0x1153 runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f3b5c022800 nid=0x1154 runnable "VM Periodic Task Thread" os_prio=0 tid=0x00007f3b5cad6000 nid=0x117d waiting on condition JNI global references: 262

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java多线程死锁例子

目录一、产生死锁的原因二、如何避免死锁一、产生死锁的原因 发生死锁的情况&#xff1a; 多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况&#xff0c;就是&#xff0c;两个线程互相等待着对象释放锁&#xff0c;一直这样僵持下去&#xff0c;所以导致了死锁…

安卓四大组件简介

安卓四大组件 Activity活动&#xff0c;Service服务&#xff0c;BroadcastRecevicer广播接受器&#xff0c;Content Provider内容提供者 Activity活动 所有程序的流程都运行在activity中 Service服务 只能后台运行&#xff0c;没有界面的长生命周期的代码 BroadcastRece…

WebLogic域的创建与发布

目录一、前言二、准备三、创建域步骤第一步&#xff1a;直接【回车】第二步&#xff1a;直接【回车】第三步&#xff1a;直接【回车】第四步&#xff1a;输入域名称后【回车】第五步&#xff1a;直接【回车】第六步&#xff1a;直接【回车】&#xff08;此步骤是提示域的存放目…

WebLogic启动失败:java.lang.AssertionError: Could not obtain the localhost address.

目录一、错误信息二、解决方案第一步&#xff1a;查看本机计算机名称第二步&#xff1a;编辑hosts文件一、错误信息 linux下启动WebLogic报如下错误&#xff1a; 二、解决方案 此错误多半是hosts文件不对导致的。 解决步骤如下&#xff1a; 第一步&#xff1a;查看本机计…

Windows查找JDK的路径

第一步&#xff1a;确定是否安装JDK 在控制台输入&#xff1a; java -version输出结果&#xff1a; 此时说明你电脑安装了JDK。 第二步&#xff1a;查找路径 然后在控制台输入&#xff1a; java -verbose输出结果&#xff1a; 从最后的jre目录可以找到相应的jdk目录。 …

安卓布局中xml文件属性和ID简介

编写xml属性 加载xml资源 当编译应用时&#xff0c;系统会将每个xml文件编译为view资源 属性 xml属性&#xff1a;特有属性&#xff0c;共有属性&#xff0c;其他属性&#xff08;布局参数&#xff09; ID ——在结构树中对view对象唯一标识 编译应用后&#xff0c;系统以…

Java监控工具VisualVM

目录一、简介二、内存分析1、Heap堆三、CPU分析四、线程分析一、简介 VisualVM 是一款免费的&#xff0c;集成了多个JDK命令行工具的可视化工具&#xff0c;它能为您提供强大的分析能力&#xff0c;对Java应用程序做 性能分析和调优 。这些功能包括 生成和分析海量数据、跟踪内…

C++数据类型

C 数据类型 |–基本数据类型: 整型 short短整型 2 int基本整型4 long长整型 8 浮点型 float单精度型 4 double双精度型 8 long double长双精度型 16 字符型 char 1 逻辑型 bool 1 空类型 void |–构造类型 数组类型 构造体类型 struct 共用体类型 union 枚举类型 enum 类类型…

Android Gradle 多渠道打包、动态配置AppName

目录一、简介二、Gradle多渠道打包1、普通做法2、Gradle多渠道打包一、简介 因为国内Android应用分发市场的现状&#xff0c;我们在发布APP时&#xff0c;一般需要生成多个渠道包&#xff0c;上传到不同的应用市场。这些渠道包需要包含不同的渠道信息&#xff0c;在APP和后台交…

Android Gradle 批量修改生成的apk文件名

目录一、简介二、代码实现1、 Gradle 3.0以下版本2、Gradle 3.0以上版本一、简介 平时开发都知道&#xff0c;我们要上线的时候需要在Android studio打包apk文件&#xff0c;可是默认的打包名是app-release.apk或者app-debug.apk这样的名字&#xff0c;太没有辨识度了。 下面…

Android Studio 代理设置以及代理完全清除

目录一、代理设置二、代理完全清除一、代理设置 首先我们来看下怎样设置代理&#xff0c;Mac下打开【Preferences…】&#xff0c;然后搜索"HTTP"&#xff0c;选择【HTTP Proxy】&#xff0c;按图中设置配置好后&#xff0c;点击【Apply】&#xff0c;然后在点击【O…

安卓布局位置,dp与px的区别

手机6寸—指对角线 布局位置 横轴—x轴 纵轴—y轴 一个像素点 dp与Px dp:设备无关像素,与像素密度相关,像素距离 dpi:像素密度,每英寸包含的像素数 px:屏幕上一个物理像素点 ldpi低密度 1dp0.75px mdpi中密度 1dp1px hdpi高密度 1dp1.5px xhdpi超高密度 1dp2px xxhdpi超…

Android程序结构

Project方式 .gradle文件夹:编译相关生成 .idea文件夹:idea生成 app文件夹----应用程序的源代码和资源 build----编译后的文件存放的位置,最终apk文件存放的位置 libs:存放.jar和.so文件 src:AndroidTest与test存放测试相关的内容 main中Java文件夹存放Java源码,res文件…

通过Github创建Android库供其他项目依赖引用

目录一、简介二、实现第一步&#xff1a;将自己的项目托管到Github上。第二步&#xff1a;点击releases。第三步&#xff1a;创建release。第四步&#xff1a;填写版本号、名称、描述信息。第五步&#xff1a;点击【Publish release】。第六步&#xff1a;复制项目路径。第七步…

使用boost模板函数实现读写锁

介绍 shared_mutex即读写锁&#xff0c;不同与我们常用的独占式锁mutex&#xff0c;shared_mutex是共享与独占共存的锁&#xff0c;实现了读写锁的机制&#xff0c;即多个读线程一个写线程&#xff0c;通常用于对于一个共享区域的读操作比较频繁&#xff0c;而写操作比较少的情…

安卓内边距padding与外边距magrin

内边距padding与外边距margin 内边距只有容器才有,即里面要有视图 具体示例

Android Studio发布项目到jcenter

目录一、创建Bintray账户及Maven仓库二、上传项目到jcenter1、配置Android项目2、Gradle命令上传3、在项目中引用4、Add to JCenter三、Demo示例一、创建Bintray账户及Maven仓库 1、打开Bintray首页&#xff0c;点击 For an Open Source Account &#xff0c;快速注册或者用第…

Android MotionEvent中getX()、getRawX()和getTop()的区别

为了展示getX()、getRawX()和getTop()方法的区别&#xff0c;我们写了一个简单的测试Demo&#xff0c;我们写了一个自定义控件&#xff08;继承ImageView&#xff09;。 package com.demo.ui;import android.content.Context; import android.support.annotation.Nullable; im…

毛概 第二章新民主主义革命理论

1.新民主主义革命的总路线 2.