java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息

Jstack 用于打印出给定的 java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息。

这里需要注意的是 Java 8 引入了 Java Mission Control,Java Flight Recorder,和 jcmd 等工具来帮助诊断 JVM 和 Java 应用相关的问题。推荐使用最新的工具以及 jcmd 来进行诊断。

Prints Java thread stack traces for a Java process, core file, or remote debug server. This command is experimental and unsupported.

jstack 命令能够:

Troubleshoot with jstack Utility

Force a Stack Dump

Stack Trace from a Core Dump

Mixed Stack

如果 java 程序崩溃生成 core 文件,jstack 工具可以用来获得 core 文件的 java stack 和 native stack 的信息,从而可以轻松地知道 java 程序是如何崩溃和在程序何处发生问题。另外,jstack 工具还可以附属到正在运行的 java 程序中,看到当时运行的 java 程序的 java stack 和 native stack 的信息,如果运行的 java 程序呈现 hung 的状态,jstack 是非常有用的。

thread dump 就是将当前时刻正在运行的 JVM 的线程拷贝一份,可以用来分析程序执行情况。

用法

打印某个进程的堆栈信息

jstack [PID]

jstack -l [PID]

jstack -m [PID]

jstack -F [PID]

关于如何找到 PID,有很多方法,使用 jps -v 或者 ps -aux 或者 htop 等等方法都可以。

说明:

-l 选项会打印额外的信息,比如说锁信息, locks such as a list of owned java.util.concurrent ownable synchronizers,可以查看 AbstractOwnableSynchronizer

-F Force a Stack Dump

分析 jstack 输出

在执行 jstack -l [PID] > /tmp/output.txt 之后可以对 /tmp/output.txt 进行分析

jstack 输出开头是当前 dump 的时间和 JVM 基本信息(包括版本等):

2018-05-24 14:41:06

Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.101-b13 mixed mode):

Threads class SMR info:

_java_thread_list=0x00007f3cd4005870, length=30, elements={

0x00007f3d14011800, 0x00007f3d142dd800, 0x00007f3d142e1800, 0x00007f3d142f4000,

0x00007f3d142f6000, 0x00007f3d142f8000, 0x00007f3d142fa000, 0x00007f3d14333800,

0x00007f3d14340000, 0x00007f3d14bc6800, 0x00007f3c900a1000, 0x00007f3c90255000,

0x00007f3c9025e800, 0x00007f3c90264000, 0x00007f3d14bdf800, 0x00007f3c64008800,

0x00007f3c6400b000, 0x00007f3d14c1e800, 0x00007f3c54025800, 0x00007f3c54027000,

0x00007f3c54042800, 0x00007f3c54044800, 0x00007f3c24005800, 0x00007f3c0c008800,

0x00007f3c0c00a000, 0x00007f3c0c00b800, 0x00007f3c48027000, 0x00007f3c48010000,

0x00007f3c48011000, 0x00007f3cd4004800

}

接下来就是程序的线程信息(非 VM 线程,非 GC 线程):

"main" #1 prio=5 os_prio=0 cpu=1071286.79ms elapsed=509136.64s tid=0x00007f3d14011800 nid=0xad5 runnable [0x00007f3d1993a000]

java.lang.Thread.State: RUNNABLE

at org.eclipse.swt.internal.gtk.OS.Call(Native Method)

at org.eclipse.swt.widgets.Display.sleep(Display.java:5570)

at smartgit.Wx.d(SourceFile:305)

at com.syntevo.smartgit.n.a(SourceFile:398)

at com.syntevo.smartgit.n.a(SourceFile:247)

"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=94.43ms elapsed=509136.51s tid=0x00007f3d142dd800 nid=0xadc waiting on condition [0x00007f3cf10f4000]

java.lang.Thread.State: RUNNABLE

at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.3/Native Method)

at java.lang.ref.Reference.processPendingReferences(java.base@11.0.3/Reference.java:241)

at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.3/Reference.java:213)

Locked ownable synchronizers:

- None

线程信息又可以划分成几个部分。

Section

Example

解释

线程名字

main 和 Reference Handler

可读的线程名字,这个名字可以通过 Thread 方法 setName 设定

线程 ID

#1

每一个 Thread 对象的唯一 ID,这个 ID 是自动生成的,从 1 开始,通过 getId 方法获得

是否守护线程

daemon

这个标签用来标记线程是否是守护线程,如果是会有标记,如果不是这没有

优先级

prio=10

Java 线程的优先级,可以通过 setPriority 方法设置

OS 线程的优先级

os_prio

CPU 时间

cpu=94.43ms

线程获得 CPU 的时间

elapsed

elapsed=509136.51s

线程启动后经过的 wall clock time

Address

tid

Java 线程的地址,这个地址表示的是 JNI native Thread Object 的指针地址

OS 线程 ID

nid

The unique ID of the OS thread to which the Java Thread is mapped.

线程状态

wating on condition

线程当前状态 线程状态下面就是线程的堆栈信息

Locked Ownable Synchronizer

线程的运行状态:

New: 线程对象创建,不可执行

Runnable: 调用 thread.start() 进入 runnable,获得 CPU 时间即可执行

Running: 执行

Waiting: thread.join()或调用锁对象 wait() 进入该状态,当前线程会保持该状态直到其他线程发送通知到该对象

Timed_Waiting:执行 Thread.sleep(long)、thread.join(long) 或 obj.wait(long) 等就会进该状态,与 Waiting 的区别在于 Timed_Waiting 的等待有时间限制;

Blocked: 等待锁,进入同步方法,同步代码块,如果没有获取到锁会进入该状态。该线程尝试进入一个被其他线程占用的 synchronized 块,当前线程直到锁被释放之前一直都是 blocked 状态

Dead:执行结束,或者抛出了未捕获的异常之后

Deadlock: 死锁

Waiting on condition:等待某个资源或条件发生来唤醒自己

Waiting on monitor entry:在等待获取锁

terminated 线程已经结束 run() 并且通知其他线程 joining

以上内容来自 Oracle

通过 jstack 信息可以分析线程死锁,或者系统瓶颈,但是这篇文章比较粗浅,只介绍了大概,等以后熟悉了补上。

reference

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

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

相关文章

数据洪流来袭,企业转型势不可挡,如何四两拨千斤?

在漫长的历史里,文明的进步都是伴随着科技的发展,企业也在不断进化,无论是商业战略还是商业模式,在科技的推动下与时俱进,不断更迭创新。历史的长河流入数据洪流的时代,人工智能、大数据、云计算等新技术掀…

java写出http数据包_java用jpcap怎么识别出http和https的数据包?

问题简述:利用java的第三方库jpcap写抓包程序,求解怎么识别出http和https的数据包(就只要能判断出是http协议或https协议即可)。测试的解法:1.在tcp包(jpcap自带TCPPacket类比较方便识别tcp包)的基础上用80端口和443端口区分http和https&…

福利 | 2018 OpenInfra Days China限量版免费票任性放出

号外号外!福利来袭,手速up up up~春困夏乏秋盹冬眠暑气炎炎,OpenInfra帮你提神醒脑——特别好礼限量放送Ready?Go!2018 年 6 月 21-22 日,OpenInfra Days China将于国家会议中心北京升级回归,汇…

开源不止,前进不息:2018 OpenInfra Days China来了!

OpenStack Days China是由一群热衷并专注于开源的中国志愿者为中国开源社区组织和举办的年度社区活动。近两年来,志愿者团队成功激起广泛关注,获得了中国各行各业和来自全球开源开发者社区的巨大支持。会议注册人数共计超过 1 万人,参与人数逾…

java 中创建数据端口_java 如何在服务器端用socket创建一个监听端口,并对接受的数据进行处理,端口号为3333,请高手指点一下...

匿名用户1级2011-09-10 回答我百度HI你好了public class Test {public static void main(String[] args) {Test1 tnew Test1();t.start(); //启动线程}}/*** 继承一个线程类* author Administrator**/class Test1 extends Thread{private ServerSocket server null;public Tes…

短暂相逢却回味无穷,全球最具影响力的以太坊技术会议视频,你保存了吗!...

关注我们,了解更多精彩内容自2008年中本聪发表的那篇仅短短9页的比特币白皮书后,毁誉参半的比特币对当今互联网及物联网的世界格局产生了重大的影响,其后延伸出来的区块链技术成为了全球最时髦的名词。相比比特币,以太坊是区块链技…

java函数式编程 map_函数式编程-对Java 8流进行分区

将任意源流划分为固定大小的批次是不可能的,因为这会加重并行处理。 并行处理时,您可能不知道拆分后第一个子任务中有多少个元素,因此您无法为下一个子任务创建分区,直到完全处理第一个子任务。但是,可以从随机访问ofS…

互联网+2.0:技术有多强 梦想才有多近

在过去不到十年的时间里,互联网行业高速发展。先是以手机、pad等智能终端为主的移动互联网打破了PC端互联网商业发展瓶颈,实体经济也依托互联网进行改造升级,“互联网”成为行业图腾和符号。后是随着人工智能、大数据、云计算等技术的融入&am…

java定时器 并发_【java多线程与并发库】— 定时器的应用 | 学步园

定时器的应用1、 定时器主要涉及到两个类(java.util包中)-》public class Timer extendsObject(一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。 )-->public abstract class TimerTask extendsObjectimple…

java返回object的类型_为什么标准java类的clone()返回Object而不是实际的类型

在java中允许指定函数返回的类型,例如下面的代码public class Test {static class Dad {Dad me() {return this;}}static class Son extends Dad {Son me() {return this;}}}已验证.我们来看看ArrayList类.它已经覆盖了clone()函数(至少我看到它在Oracle jdk 1.7源代码)public …

效率提升,英特尔助力企业驶入“快车道”

随着越来越多的企业加入数字化转型大军,每个企业都在期待着数字化带来的业务创新及优化。从云平台的应用、大数据的决策分析,再到工作流程自动化,企业的IT部门不再仅仅是维护企业本身的业务运作以及数据处理,而是需要接入整个生态…

java怎么写事件listener_java 事件监听器ActionListener

/** 功能:java事件监听器ActionListener*/package com.events;import java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class changebgcolor extends JFrame implements Ac…

Spring AOP 使用介绍,从前世到今生

前面写过 Spring IOC 的源码分析,很多读者希望可以出一个 Spring AOP 的源码分析,不过 Spring AOP 的源码还是比较多的,写出来不免篇幅会大些。本文不介绍源码分析,而是介绍 Spring AOP 中的一些概念,以及它的各种配置…

求1到500以内所有的完数并输出。

如果一个数恰好等于除它本身外的所有因子之和&#xff0c;则这个数就称为完数。 例如&#xff1a;6的因子是1、2、3、&#xff0c;且6123&#xff0c;所以6是完数。 #include <stdio.h> void main() {int s,i,j;for(i1;i<500;i){printf("%d ",i);} } 在这…

java怎么用doss窗口_GitHub - doss128/symphony: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。...

下一代的社区系统&#xff0c;为未来而构建&#x1f4a1; 简介Symphony([ˈsɪmfəni]&#xff0c;n.交响乐)是一个现代化的社区平台&#xff0c;因为它&#xff1a;实现了面向内容讨论的论坛实现了面向知识问答的社区包含了面向用户分享、交友、游戏的社交网络100% 开源⚡ 动机…

机器学习算法比较

本文主要回顾下几个常用算法的适应场景及其优缺点&#xff01;&#xff08;提示&#xff1a;部分内容摘自网络&#xff09;。机器学习算法太多了&#xff0c;分类、回归、聚类、推荐、图像识别领域等等&#xff0c;要想找到一个合适算法真的不容易&#xff0c;所以在实际应用中…

还在用 Python 2.x?Python 3.7.0 正式发布!

6 月 27 日&#xff0c;期待已久的 Python 3.7.0 正式发布&#xff0c;与之同行的还有 3.6.6 版本的更新。此次&#xff0c;最新版的 Python 3.7.0 带来了诸多的新功能和优化&#xff0c;接下来&#xff0c;让我们一睹为快。Python 3.7.0 主要更新新的语法特性&#xff1a;PEP …

java entry的用法_Map.Entry用法

Java Entry用法./*** 遍历Map的方式* author MONEY*/public class test {public static void main(String[] arg0){Map mapnew HashMap();map.put("1", "da");map.put("2", "jia");map.put("3", "hao");//第一种使…

docker停止信号java_docker容器优雅停止

由于应用镜像是由spring boot制作的&#xff0c;在关注docker 容器停止之前&#xff0c;先看下Java应用是如何处理程序停止的。java shutdownhook在java程序停止前&#xff0c;我们可能会需要一些清理工作&#xff0c;如关闭数据库连接池&#xff0c;执行一些反注册等。Runtime…

2018 年你需要知道的 11 个 JavaScript 库

译者按&#xff1a;你可能已经用到Underscore或者Lodash。本文列举了11个常用的库来提高开发效率。为了保证可读性&#xff0c;本文采用意译而非直译。另外&#xff0c;本文版权归原作者所有&#xff0c;翻译仅用于学习。JavaScript依然是2018年最受欢迎、最流行的编程语言&…