深入了解Linux多线程状态查看技巧 (linux 查看多线程状态)

Linux多线程技术为并发编程提供了强大支持能力,但在实际应用过程中,由于多线程间的交互较为复杂,很容易导致程序的不稳定性。查看多线程状态成为了程序员调试的重要一环。本文将介绍Linux操作系统下多线程状态查看技巧,帮助读者解决多线程运行中遇到的问题。

1.进程和线程

我们要搞清楚进程和线程的概念。在操作系统中,一个运行中的程序称为进程,而进程中的每个执行流程都成为线程。

多个线程在同一进程之内运行。每个线程都拥有自己的寄存器和线程栈,并且与其他线程共享同一进程的数据区、堆和代码段等。线程间的切换比进程间的切换更为快速和容易。

2.查看线程状态

在Linux系统下,我们可以通过下面两条命令来查看多线程的状态:

ps -eLf

top

其中,ps命令可以列出当前主机上所有进程的状态。第二个参数是进程ID,如果省略,则表示查看当前用户的所有进程。选项e指定查看所有进程,L表示查看进程的线程。

执行命令后,我们可以看到一大串细节,它们分别代表每个线程的状态。一般来说,由多线程程序创建的线程PID的名字后面会带有很多LWP(Light Weight Process轻量级进程),每个LWP对应一个线程,我们可以根据LWP的ID号查询对应线程的信息。

另外,top命令可以实时监控系统中运行的进程和进程间的交互情况,是一款非常强大的进程管理工具。在命令窗口中执行该命令,我们可以观察到各列对应的含义:

PID:进程的ID号

PPID:父进程的ID号

USER:进程的所有者

NI:进程的优先级

%CPU:CPU占用率

%MEM:内存占用率

COMMAND:进程的命令

另外,输入H命令可以查看线程信息,SHIFT+H可以查看线程的CPU占用情况。

3.查看线程堆栈

在进行多线程程序调试时,可能会碰到线程阻塞、死锁等问题,这时我们需要查看线程堆栈,以帮助解决问题。在Linux系统中,我们可以使用gdb工具来查看线程堆栈。

我们需要使用-g选项启动程序。例如:

gdb -g a.out

然后,运行二进制文件,其中N表示线程号,可以使用info threads命令查看当前进程的线程情况。

r N

然后,在gdb命令行窗口中输入thread apply all bt命令,查看每个线程的堆栈信息。apply all参数表示对所有线程进行查看,bt命令表示查看线程的堆栈。

这种方式的缺点在于,当线程数较多时需要大量的输入,比较麻烦。有一种更有效的方式是在代码中添加堆栈打印语句。在需要查看堆栈的位置加入以下代码:

#include

#include

#include

#include

#include

#include

#define TRACE_MAX_STACK_FRAMES 50

void print_trace (int signum)

{

fprintf(stderr, “Error: signal %d:\n”, signum);

void *trace[TRACE_MAX_STACK_FRAMES];

int trace_size = backtrace(trace, TRACE_MAX_STACK_FRAMES);

char **messages = backtrace_symbols(trace, trace_size);

for (int i = 0; i

fprintf(stderr, “%d: %s\n”, i, messages[i]);

}

free(messages);

exit(1);

}

void *task1(void *arg) {

signal(SIGSEGV, print_trace);

}

4.其他注意事项

在编写多线程程序时,还需要注意以下事项,以提高程序的稳定性:

避免竞争情况:在多线程程序中,线程间的共享数据可能会导致竞争情况,导致程序的不稳定性。因此,在编写程序时,需要使用线程同步机制避免竞争情况的发生。

正确设置优先级:在多线程程序中,不同线程的执行顺序可能会对程序的正确性产生影响。对于一些较为关键的任务,程序员需要设置较高的优先级来保证它们的及时执行。

正确的线程数目:这项要求的关键是要把握好线程数的细度。如果线程数过多,在上下文的切换中会花费大量的时间,降低程序的效率。如果线程数过少,则不能很好地利用多核心CPU的性能,进而影响程序执行效率。实际的线程数应该根据实际情况进行动态调优。

相关问题拓展阅读:

  • Linux多线程编程
  • kill-3生成的线程堆栈怎么查看

Linux多线程编程

编译时要用到pthread 库:gcc -lpthread

错误码位置:/usr/include/a-generic/errno.h

gcc pthread_create.c -lpthread

思考:主子线程交替打印奇数偶数。

思考:证明线程可以自己取消自己。

思考:证明SIGKILL和SIGSTOP 是无法阻塞的。

/usr/include/bits/pthreadtypes.h中查看pthread_mutex_t

思考:用多线程将一个文件1.c拷贝3个副本,11.c,12.c,13.c

思考:多个生产者和消费者

思考:将互斥量等初始化使用pthread_once实现。

思考:设置线程的分离属性,然后在新县城中获取自己的分离属性。

kill-3生成的线程堆栈怎么查看

之一步:在终端运行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 线程栈的问题排查

关于linux 查看多线程状态的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《深入了解Linux多线程状态查看技巧 (linux 查看多线程状态)》
文章链接:https://zhuji.vsping.com/32134.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。