在Linux系统中,dump堆栈信息是一项非常重要的任务,它可以帮助程序员和系统管理员快速了解程序的运行情况,尤其是当程序出现异常或者崩溃时,dump堆栈信息可以有效地帮助我们定位问题的根源。本文将介绍在Linux系统中如何dump堆栈信息。
什么是堆栈?
在计算机科学中,堆栈是一种特殊的数据结构,它是一个先进后出(LIFO)的数据结构,在堆栈中,最后进入的元素是首先被处理的。堆栈常常被用来实现函数调用的过程,每个函数调用都会在堆栈中分配一定的空间,当函数调用结束后,这些空间会被释放。
当程序出现异常或者崩溃时,堆栈信息可以非常有用,因为它可以显示程序在崩溃前的调用栈信息,从而帮助我们确定程序崩溃的原因及其在代码中的位置。
如何dump堆栈信息?
在Linux系统中,dump堆栈信息可以通过多种方式实现,下面我们将介绍几种常见的方法。
方法一、使用gdb调试器
gdb是Linux下著名的调试器,可以用来调试C语言、C++、Python等多种编程语言的程序。在gdb中,使用“bt”命令即可查看程序的堆栈信息,具体操作步骤如下:
1. 使用gdb启动程序:
“`
gdb your_program
“`
2. 在gdb中执行“run”命令启动程序:
“`
(gdb) run
“`
3. 等程序出现异常或者崩溃后,在gdb中执行“bt”命令查看堆栈信息:
“`
(gdb) bt
“`
方法二、使用pstack工具
pstack是Linux下的一个工具,它可以显示当前进程的堆栈信息。具体操作步骤如下:
1. 执行以下命令查看程序的PID:
“`
ps aux | grep your_program
“`
其中your_program是指要查看的程序名称。
2. 使用pstack工具查看PID对应的进程的堆栈信息:
“`
pstack PID
“`
其中PID是上一步查询到的程序的PID。
方法三、使用jstack工具
jstack是Java jdk自带的一种工具,它可以用来查看Java虚拟机进程的堆栈信息。常常用来查看Java进程是否出现死锁、线程阻塞等问题。具体操作步骤如下:
1. 执行以下命令查看程序的PID:
“`
ps aux | grep java | grep your_program
“`
其中your_program是指要查看的Java程序名称。
2. 使用jstack工具查看PID对应的进程的堆栈信息:
“`
jstack PID
“`
其中PID是上一步查询到的Java程序的PID。
无论是对于程序员还是系统管理员来说,dump堆栈信息是一项非常重要的任务。通过对堆栈信息的分析,我们可以了解程序的整个调用过程,确定程序崩溃的原因及其在代码中的位置。在Linux系统中,我们可以使用gdb、pstack、jstack等工具来dump堆栈信息。这些工具的使用方法不同,但其实现的目的是相同的,即通过查看程序的堆栈信息来帮助我们快速解决问题。
相关问题拓展阅读:
线程dump是非常有用的诊断java应用问题的工具,每一个java虚早旅拟机都有及时生成显示所有线程在某一点状态的线程dump能力。虽然每个java虚拟机线程dump打印输出格式上略微有散睁陵一些不同,但是线程dump的信息包含线程基本信息、线冲戚程的运行状态、标识、调用的堆栈;调用的堆栈包含完整的类名,所执行的方法,如果可能的话还有源代码的行数。
之一步:在终端运行Java程序
第二步:通过命令 pidof java 找到已经启动的java进程的ID,选择需要查看的java程序的进程ID
第三步:使用命令 kill -3 打印出java程序的线程堆栈信息
第四步:通常情况下运行的项目可和卖迅能会比较大,那么这个时候打印的堆栈信息可能会有几千到几万行,为了方便查看,我们往往需要将输出内容进行重定向
使用linux下的重定向命令方式即可:例如: demo.sh > run.log 2>&1 将输出信息重定向到 run.log中。
注:在操作系统中,0 1 2分别对应着不同的含义, 如下:
0 : 标准输入,即:C中的stdin , java中的System.in
1 : 标准输出, 即:C中的stdout ,java中的配正System.out
2 : 错误输出, 即:C中的stderr , java中的System.err
Demo:
Sources Code :
public class PrintThreadTrace {
Object obj1 = new Object();
Object obj2 = new Object();
public void func1(){
synchronized (obj1){
func2();
}
}
public void func2(){
synchronized (obj2){
while(true){
System.out.print(“”);
}
}
}
public static void main(String args){
PrintThreadTrace ptt = new PrintThreadTrace();
ptt.func1();
}
}
按照步骤操作后唤此的打印输出信息:
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode):
“Service Thread” daemon prio=10 tid=0x00007fdc880a9000 nid=0x12a4 runnable
java.lang.Thread.State: RUNNABLE
“C2 CompilerThread1” daemon prio=10 tid=0x00007fdc880a7000 nid=0x12a3 waiting on condition
java.lang.Thread.State: RUNNABLE
“C2 CompilerThread0” daemon prio=10 tid=0x00007fdc880a4000 nid=0x12a2 waiting on condition
java.lang.Thread.State: RUNNABLE
“JDWP Command Reader” daemon prio=10 tid=0x00007fdcnid=0x1299 runnable
java.lang.Thread.State: RUNNABLE
“JDWP Event Helper Thread” daemon prio=10 tid=0x00007fdc880a1800 nid=0x1298 runnable
java.lang.Thread.State: RUNNABLE
“JDWP Transport Listener: dt_socket” daemon prio=10 tid=0x00007fdc8809e000 nid=0x1297 runnable
java.lang.Thread.State: RUNNABLE
“Signal Dispatcher” daemon prio=10 tid=0x00007fdcnid=0x1296 waiting on condition
java.lang.Thread.State: RUNNABLE
“Finalizer” daemon prio=10 tid=0x00007fdcnid=0x1295 in Object.wait()
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
– waiting on (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
– locked (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
“Reference Handler” daemon prio=10 tid=0x00007fdc8806f800 nid=0x1294 in Object.wait()
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
– waiting on (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
– locked (a java.lang.ref.Reference$Lock)
“main” prio=10 tid=0x00007fdc8800b800 nid=0x128e runnable
java.lang.Thread.State: RUNNABLE
at com.wenchain.study.PrintThreadTrace.func2(PrintThreadTrace.java:20)
– locked (a java.lang.Object)
at com.wenchain.study.PrintThreadTrace.func1(PrintThreadTrace.java:13)
– locked (a java.lang.Object)
at com.wenchain.study.PrintThreadTrace.main(PrintThreadTrace.java:27)
“VM Thread” prio=10 tid=0x00007fdc8806b000 nid=0x1293 runnable
“GC task thread#0 (ParallelGC)” prio=10 tid=0x00007fdcnid=0x128f runnable
“GC task thread#1 (ParallelGC)” prio=10 tid=0x00007fdcnid=0x1290 runnable
“GC task thread#2 (ParallelGC)” prio=10 tid=0x00007fdcnid=0x1291 runnable
“GC task thread#3 (ParallelGC)” prio=10 tid=0x00007fdcnid=0x1292 runnable
“VM Periodic Task Thread” prio=10 tid=0x00007fdc880b3800 nid=0x12a5 waiting on condition
JNI global references: 1391
Heap
PSYoungGen total 17920K, used 1270K
eden space 15872K, 8% used
from space 2023K, 0% used
to space 2023K, 0% used
ParOldGentotal 39424K, used 0K
object space 39424K, 0% used
PSPermGentotal 21504K, used 2619K
object space 21504K, 12% used
上面的信息中包含了当前JVM中所有运行的线程信息,其中在示例中我们启动的线程为main线程,其余的都是JVM自己创建的。
在打印的信息中,我们可以清楚的看见当前线程的调用上下文,可以很清楚的知道程序的运行情况。
并且我们在最后面还能看见当前虚拟机中的内存使用情况,青年世代,老年世代的信息等等…
PS: 在JDK1.5以上,我们可以通过在Java程序中调用Thread.getStackTrace()方法来进行堆栈的自动打印,使得线程堆栈的打印时机可编程控制。
文章知识点与官方知识档案匹配
Java技能树首页概览
89841 人正在系统学习中
点击阅读全文
打开CSDN,阅读体验更佳
jstack-查看Java进程的线程堆栈信息,锁定高消耗资源代码
jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下: jstackpid jstackexecutable core jstackremote-hostname-or-ip 命令行参数选项说明如下: …
011Java并发包018查看线程堆栈信息_执笔未来的博客
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurre…
最新发布 jstack — java堆栈常用排查指令
jstack — java堆栈常用排查指令
继续访问
热门推荐 jstack 命令查看JAVA线程堆栈
JAVA堆栈信息实际生产中,可能由于开发以及测试未能全面覆盖的代码质量、性能问题,而引致线程挂起甚至崩溃。可能就需要查看堆栈信息来排查问题了。jps -lvmjps -lvm 用于查看当前机器上运行的java进程。C:\Users\Administrator>jps -lvmDosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.defa
继续访问
Java多线程——查看线程堆栈信息
Java多线程——查看线程堆栈信息 摘要:本文主要介绍了查看线程堆栈信息的方法。 使用Thread类的getAllStackTraces()方法 方法定义 可以看到getAllStackTraces()方法的返回值是一个Map对象,key是Thread的实例,value是一个StackTraceElement实例数组: 1 public static Map的线程CPU类似 1、支持一键展示当前最忙的前N个线程并打印堆栈 thread -n 3 没有线程ID,包含表示为JVM内部线程,参考dashboard命令的介绍。 cpuUsage为采样间隔时间内线程的CPU使用率,与dashboard命令的数据一致。 deltaTime为采样间隔时间内线程的增量CPU时间,小于1ms时被取整显示为0ms。 time线程运行总CPU…
继续访问
java查看线程的堆栈信息
通过使用jps 命令获取需要监控的进程的pid,然后使用jstackpid 命令查看线程的堆栈信息。 通过jstack命令可以获取当前进程的所有线程信息。 每个线程堆中信息中,都可以查看到线程ID、线程的状态(wait、sleep、running 等状态)、是否持有锁信息等。 jstack -l >jvm_listlocks.txt 转…
继续访问
java 查看线程堆栈信息_Java多线程——查看线程堆栈信息
java多线程——查看线程堆栈信息摘要:本文主要介绍了查看线程堆栈信息的方法。使用thread类的getallstacktraces()方法方法定义可以看到getallstacktraces()方法的返回值是一个map对象,key是thread的实例,value是一个stacktraceelement实例数组:1 public static map getallstacktraces()使用可以使…
继续访问
java线程堆栈信息分析
java堆栈信息分析
继续访问
java 查看堆栈_javap 命令查看堆栈中信息
javap命令是对.java文件进行反编译,通过这个命令可以看到堆栈中是怎么压栈和出栈的已经执行顺序,这里简单解释下javap的简单的使用,下面举个例子:题目:i++ 和++i的区别解释:简单点说 这个问题都不难回答,这里就不说了,但是实际上堆栈中区别也是老大了(这里就用到了javap命令), 步骤:1.在任意一个盘下面建一个名为Test.java的文件(文件名可以随意命名)代码如下:public…
继续访问
java 查看线程堆栈信息_jstack-查看Java进程的线程堆栈信息,锁定高消耗资源代码。…
jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:jstackpidjstackexecutablecorejstackremote-hostname-or-ip命令行参数选项说明如下:-llonglistings,会打印出额外的锁信息,在发生死锁时可以用jstack-lpid来观察…
继续访问
java堆栈信息怎么看_线程堆栈信息怎么看? – cs_person的个人空间 – OSCHINA – 中文开源技术交流社区…
一条线程堆栈信息大概长成下面这个样子:RMI TCP Connection(267865)-172.16.5.25″ daemon prio=10 tid=0x00007fdnid=0x55ae waiting for monitor entry java.lang.Thread.State: BLOCKED (on object m…
继续访问
线程堆栈信息怎么看?
一条线程堆栈信息大概长成下面这个样子: RMI TCP Connection(267865)-172.16.5.25″ daemon prio=10 tid=0x00007fdnid=0x55ae waiting for monitor entry
继续访问
java的栈和堆
栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 Java 的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在…
继续访问
查看java线程_【JAVA】Java线程堆栈信息查看
如何获得线程的堆栈信息?线上服务器cpu 100%了,该如何排查问题?1.top命令查询哪个pid进程占用cpu高(ps -ef|grep java 获取PID号)2.通过 top -Hp pid 可以查看该进程下各个线程的cpu使用情况,获取占用cpu高的线程id3.执行命令:printf “%X\n” 线程tid(用于获取占用cpu高的线程id的16进制数)4.执行命令:jstack pid …
继续访问
kill -3 java_kill -3 PID命令获取java应用堆栈信息
一、应用场景:当linux服务器出现异常情况(响应缓慢,负载持续飙升)并且服务器没有安装对应的包而无法使用jstack等命令时,可以使用linux的kill相关命令打印堆栈信息。命令格式:kill -3 PID二、执行步骤:2.1、获取java进程的PIDps -ef|grep java结果的第二列数字就是进程对应的pid。2.2、kill -3 PID(1)如果项目通过Tomcat进行发布(普通…
继续访问
jstack 工具 查看JVM堆栈信息
1|0介绍 jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或corefile或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项”-J-d64″,Windows的jstack使用方式只支持以下的这种方式: jstack pid 主要分为两个功能: a. 针对活着的进程做本地的或远程的线程dump; b. 针对core文件做线程dump。 jstack用于生成java虚拟机当前时刻的线程快照。线程快照是…
继续访问
linux查看java堆栈
1、查看JAVA进程JVM参数 jinfo -flags pid(进程号) -XX:CICompilerCount=2 更大的并行编译数 -XX:InitialHeapSize=JVM 的初始堆内存大小 -XX:MaxHeapSize=JVM 的更大堆内存大小 -XX:MaxNewSize=XX:MinHeapDeltaBytes=XX:NewSize=XX:OldSize=、JVM 查看.
继续访问
Linux 如何查看一个进程的堆栈
有两种方法:之一种:pstack 进程ID第二种,使用gdb 然后attach 进程ID,然后再使用命令 thread apply all bt 两种方法都可以列出进程所有的线程的当前的调用栈。不过,使用gdb的方法,还可以查看某些信息,例如局部变量,指针等。不过,如果只看调用栈的话,pstack还是很方便的。
继续访问
JAVA获取堆栈信息
1. 通过Throwable获取 StackTraceElement stackTrace = new Throwable().getStackTrace(); 2. 通过Thread获取 StackTraceElement stackTrace = Thread.currentThread().getStackTrace();
继续访问
java 查看线程栈大小_基于 Java 线程栈的问题排查
经常碰到系统跑着跑着一段时间内存满了,出现内存泄漏的问题,系统软件太庞大,这类问题又不好直接从源码中分析,所以需要借助工具来分析了,kmemleak就是这样的一个工具。
在Kernel hacking中打开CONFIG_DEBUG_KMEMLEAK =y即使能了kmemleak,其实就是开了一个内核线程,该内核线程每10分钟(默认值)扫描内存,并打印发现派耐新的未引用的对象的数量。kmemleak的原理其实就是通过kmalloc、vmalloc、kmem_cache_alloc等内存的分配,跟踪其指针,连同其他的分配大小和堆栈跟踪信息,存储在PRIO搜索树。如果存在相应的释放函数调用跟踪和指针,就会从kmemleak数据结构中移除尘毁春。下面我们看看具体的用法。
查看内核打印信息详细过程如下:
1、挂载debugfs文件系统
mount -t debugfs nodev /sys/kernel/debug/
2、开启内核自动检测线程
echo scan > /sys/kernel/debug/kmemleak
3、查看打印信息
cat /sys/kernel/debug/kmemleak
4、清除内核检测报告,新的内存泄露报告将重新写入/sys/kernel/debug/kmemleak
echo clear > /sys/kernel/debug/kmemleak
内存扫描参数可以进行修改通过向/sys/kernel/debug/kmemleak 文件写入。 参数使用如下:
off 禁用kmemleak(不可逆)
stack=on 启用任务堆栈扫描(default)
stack=off 禁用任务堆栈扫描
scan=on 启动自动记忆扫描线程(default)
scan=off 停止自动记忆扫描线程
scan= 设置n秒内自动记忆扫描,默认600s
scan 开启内核扫描
clear 清除内存泄露报告
dump= 转存信息对象在
通过“kmemleak = off”,也可以在启动时禁用Kmemleak在内核命令行。在初始化kmemleak之前,内存的分配或释放这些动作被存储在余弊一个前期日志缓冲区。这个缓冲区的大小通过配CONFIG_DEBUG_KMEMLEAK_EAR_LOG_SIZE设置。
关于linux dump堆栈信息的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
香港服务器选创新互联,2H2G首月10元开通。
创新互联(www.cdcxhl.com)互联网服务提供商,拥有超过10年的服务器租用、服务器托管、云服务器、虚拟主机、网站系统开发经验。专业提供云主机、虚拟主机、域名注册、VPS主机、云服务器、香港云服务器、免备案服务器等。
文章名称:Linux如何dump堆栈信息?(linuxdump堆栈信息)
本文链接:http://www.shufengxianlan.com/qtweb/news7/415907.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联