JVM线程诊断利器:jstack深度解析

💡亲爱的技术伙伴们:

你是否正被这些问题困扰——

  • ✔️ 投递无数简历却鲜有回音?
  • ✔️ 技术实力过硬却屡次折戟终面?
  • ✔️ 向往大厂却摸不透考核标准?

我打磨的《 Java高级开发岗面试急救包》正式上线!

  • ✨ 学完后可以直接立即以此经验找到更好的工作
  • ✨ 从全方面地掌握高级开发面试遇到的各种疑难问题
  • ✨ 能写出有竞争力的简历,通过模拟面试提升面试者的面试水平
  • ✨ 对自己的知识盲点进行一次系统扫盲

🎯 特别适合:

  • 📙急需跳槽的在校生、毕业生、Java初学者、Java初级开发、Java中级开发、Java高级开发
  • 📙非科班转行需要建立面试自信的开发者
  • 📙想系统性梳理知识体系的职场新人

课程链接:https://edu.youkuaiyun.com/course/detail/40731课程介绍如下:

Java程序员廖志伟Java程序员廖志伟

优快云Java程序员廖志伟

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

Java程序员廖志伟

🍊 JVM核心知识点之jstack:概述

在当今的软件开发领域,Java虚拟机(JVM)作为Java程序运行的核心环境,其稳定性和性能直接影响到应用程序的运行效率。在众多JVM核心知识点中,jstack工具因其强大的诊断功能而备受关注。以下将围绕jstack进行详细阐述。

在实际开发过程中,我们经常会遇到程序运行异常的情况,如线程阻塞、死锁等。这些异常往往难以通过常规的调试手段定位,而jstack工具则能有效地帮助我们解决这个问题。它能够打印出指定进程或核心文件中所有线程的堆栈跟踪信息,从而帮助我们快速定位问题所在。

jstack工具的作用主要体现在以下几个方面:

  1. 定位线程问题:通过分析线程堆栈信息,我们可以了解线程的执行状态,从而判断线程是否处于阻塞、死锁等异常状态。

  2. 分析性能瓶颈:通过观察线程的执行流程,我们可以发现程序中的性能瓶颈,如频繁的锁竞争、死循环等。

  3. 优化代码:通过分析线程堆栈信息,我们可以发现代码中的潜在问题,如资源泄露、死锁等,从而优化代码,提高程序性能。

  4. 故障排查:在程序出现故障时,jstack工具可以帮助我们快速定位故障原因,提高故障排查效率。

jstack工具适用于以下场景:

  1. 线程阻塞:当程序中出现线程阻塞时,使用jstack可以快速定位阻塞原因,如锁等待、条件等待等。

  2. 死锁:在发现死锁问题时,jstack可以帮助我们分析死锁的线程关系,从而找到解决死锁的方法。

  3. 性能瓶颈:在分析程序性能瓶颈时,jstack可以帮助我们了解线程的执行情况,从而找到性能瓶颈所在。

  4. 故障排查:在程序出现故障时,jstack可以帮助我们快速定位故障原因,提高故障排查效率。

接下来,我们将对jstack的概念、作用以及适用场景进行详细介绍,帮助读者全面了解这一JVM核心知识点。通过本文的介绍,相信读者能够更好地掌握jstack工具,为日常开发工作提供有力支持。

JVM核心知识点之jstack:概念

在Java虚拟机(JVM)的日常运维和性能调优过程中,jstack工具扮演着至关重要的角色。它能够帮助我们深入理解JVM中线程的状态,从而进行问题定位和性能诊断。下面,我们将详细探讨jstack的概念及其在JVM中的应用。

jstack是一个命令行工具,用于打印指定Java进程ID或核心文件中所有线程的堆栈跟踪信息。通过分析这些堆栈跟踪,我们可以了解线程的当前状态,包括哪些线程正在执行,哪些线程处于等待状态,以及它们执行到哪个方法的具体位置。

🎉 线程状态解析

在JVM中,线程的状态可以分为以下几种:

  • 新建(New):线程对象被创建后尚未启动。
  • 运行(Runnable):线程获取到CPU资源正在执行。
  • 阻塞(Blocked):线程因为等待某个资源而阻塞。
  • 等待(Waiting):线程在等待某个条件成立。
  • 超时等待(Timed Waiting):线程在等待某个条件成立,但设置了超时时间。
  • 终止(Terminated):线程执行完毕或被其他线程终止。

jstack能够显示每个线程的状态,帮助我们快速定位哪些线程可能存在问题。

🎉 命令行使用

要使用jstack,首先需要获取目标Java进程的进程ID。以下是一个基本的jstack命令示例:

jstack -l <pid>

其中,<pid>是Java进程的进程ID,-l选项表示打印线程的堆栈跟踪信息,包括锁信息。

🎉 输出分析

jstack的输出结果通常包含以下信息:

  • 线程ID:线程的唯一标识。
  • 状态:线程当前的状态。
  • 堆栈跟踪:线程执行到的方法调用栈。

通过分析这些信息,我们可以了解线程的执行流程,以及可能存在的死锁、资源竞争等问题。

🎉 性能诊断

在性能诊断过程中,jstack可以帮助我们:

  • 识别热点线程:找出占用CPU时间最多的线程,分析其执行流程。
  • 定位性能瓶颈:通过分析线程的堆栈跟踪,找出导致性能问题的代码段。
  • 优化代码:根据分析结果,对代码进行优化,提高程序性能。

🎉 问题定位

当系统出现问题时,jstack可以帮助我们:

  • 定位线程死锁:通过分析线程的堆栈跟踪,找出死锁的线程及其持有的锁。
  • 分析线程泄漏:找出长时间占用资源而不释放的线程,分析其执行流程。
  • 诊断线程异常:通过分析线程的堆栈跟踪,找出线程抛出的异常及其原因。

🎉 线程分析工具

除了jstack,还有其他一些线程分析工具,如:

  • VisualVM:一款集成了多种JVM监控和分析功能的图形化工具。
  • MAT(Memory Analyzer Tool):一款用于分析Java堆内存的工具,可以帮助我们找出内存泄漏。

总之,jstack是JVM运维和性能调优中不可或缺的工具之一。通过深入理解其概念和应用,我们可以更好地掌握JVM的运行状态,从而提高程序的性能和稳定性。

线程状态 描述 jstack输出示例
新建(New) 线程对象被创建后尚未启动,此时线程处于不可见状态。 "0x00007f9c39800000" NEW "main"
运行(Runnable) 线程获取到CPU资源正在执行,此时线程处于可见状态。 "0x00007f9c39800000" RUNNABLE "Thread-1"
阻塞(Blocked) 线程因为等待某个资源而阻塞,此时线程处于不可见状态。 "0x00007f9c39800000" BLOCKED on object monitor @0x000000006f9c3980
等待(Waiting) 线程在等待某个条件成立,此时线程处于不可见状态。 "0x00007f9c39800000" WAITING on <Object.wait() @0x000000006f9c3980>
超时等待(Timed Waiting) 线程在等待某个条件成立,但设置了超时时间,超时后线程将变为可运行状态。 "0x00007f9c39800000" TIMED_WAITING on <Object.wait()@0x000000006f9c3980 for 10 seconds>
终止(Terminated) 线程执行完毕或被其他线程终止,此时线程不可见。 "0x00007f9c39800000" TERMINATED
命令行选项 描述 示例
-l 打印线程的堆栈跟踪信息,包括锁信息。 jstack -l <pid>
<pid> Java进程的进程ID。 <pid> = 1234
-F 如果jstack命令没有响应,使用强制模式。 jstack -F <pid>
-m 打印Java堆栈跟踪以及本地系统堆栈跟踪。 jstack -m <pid>
-h--help 显示帮助信息。 jstack -hjstack --help
输出信息 描述 示例
线程ID 线程的唯一标识。 "0x00007f9c39800000"
状态 线程当前的状态。 "RUNNABLE"
堆栈跟踪 线程执行到的方法调用栈。 "at java.lang.Thread.sleep(Native Method)"
锁信息 线程持有的锁以及等待的锁。 "ObjectMonitor@0x000000006f9c3980, 4 locked, 0 waiting, 0 waiting to block"
性能诊断应用 描述 示例
识别热点线程 找出占用CPU时间最多的线程。 "Thread-1" is the most CPU consuming thread.
定位性能瓶颈 通过分析线程的堆栈跟踪,找出导致性能问题的代码段。 "The performance bottleneck is in the method 'com.example.MyMethod'."
优化代码 根据分析结果,对代码进行优化,提高程序性能。 "Optimize the method 'com.example.MyMethod' to reduce CPU usage."
问题定位应用 描述 示例
定位线程死锁 通过分析线程的堆栈跟踪,找出死锁的线程及其持有的锁。 "Thread-1 and Thread-2 are deadlocked on the lock 'Object@0x000000006f9c3980'."
分析线程泄漏 找出长时间占用资源而不释放的线程,分析其执行流程。 "Thread-3 is holding a resource for a long time without releasing it."
诊断线程异常 通过分析线程的堆栈跟踪,找出线程抛出的异常及其原因。 "Thread-4 threw an exception 'java.lang.RuntimeException: Error message'."

在分析线程状态时,我们不仅要关注线程的当前状态,还要深入理解其背后的原因。例如,线程处于“新建(New)”状态时,意味着线程对象已经被创建,但尚未启动。此时,线程处于不可见状态,因为Java虚拟机还没有开始执行线程的run方法。这种状态下,线程的堆栈跟踪信息会显示其处于NEW状态,如示例中的“0x00007f9c39800000 NEW "main"”。

当线程进入“运行(Runnable)”状态时,它已经获取到CPU资源并开始执行。此时,线程处于可见状态,其堆栈跟踪会显示其正在执行的任务,如“0x00007f9c39800000 RUNNABLE "Thread-1"”。

然而,线程的状态并非一成不变。例如,线程可能会因为等待某个资源而进入“阻塞(Blocked)”状态。在这种情况下,线程会等待直到资源可用。此时,堆栈跟踪会显示线程正在等待的锁信息,如“0x00007f9c39800000 BLOCKED on object monitor @0x000000006f9c3980”。

了解线程状态对于性能诊断和问题定位至关重要。通过分析线程的堆栈跟踪,我们可以识别热点线程、定位性能瓶颈,甚至优化代码以提高程序性能。例如,如果发现某个线程长时间占用CPU资源,我们可以通过优化该线程的代码来减少CPU的使用。此外,通过分析线程的堆栈跟踪,我们还可以诊断线程死锁、分析线程泄漏,甚至找出线程异常的原因。

// 以下为Java代码示例,展示如何使用jstack命令获取线程堆栈信息
public class JStackExample {
    public static void main(String[] args) {
        // 获取当前JVM中所有线程的堆栈信息
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        long[] threadIds = threadMXBean.getAllThreadIds();
        ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(threadIds);

        // 打印每个线程的堆栈信息
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println("Thread ID: " + threadInfo.getThreadId() + ", Name: " + threadInfo.getThreadName());
            StackTraceElement[] stackTraceElements = threadInfo.getStackTrace();
            for (StackTraceElement stackTraceElement : stackTraceElements) {
                System.out.println("    " + stackTraceElement.toString());
            }
        }
    }
}

JVM核心知识点之jstack:作用

jstack是JVM自带的命令行工具,用于打印指定进程ID或核心文件中所有线程的堆栈跟踪信息。通过分析线程的堆栈信息,我们可以了解线程的执行状态,定位线程执行过程中的问题,从而进行性能诊断和问题定位。

在JVM中,线程的状态包括运行、等待、阻塞、创建、终止等。通过jstack命令,我们可以查看每个线程的状态,以及线程在执行过程中调用的方法。以下是一些jstack命令的常用用法:

  1. 查看指定进程ID的所有线程堆栈信息:
jstack -l <pid>

其中,<pid>为进程ID。

  1. 查看指定线程ID的堆栈信息:
jstack -l <pid> <tid>

其中,<tid>为线程ID。

  1. 查看指定核心文件的线程堆栈信息:
jstack -F -l <corefile>

其中,<corefile>为核心文件路径。

通过分析线程的堆栈信息,我们可以了解以下内容:

  • 线程执行状态:运行、等待、阻塞等。
  • 线程执行方法:查看线程在执行过程中调用的方法,有助于定位问题。
  • 线程资源消耗:分析线程在执行过程中占用的CPU和内存资源,有助于优化性能。
  • 线程死锁检测:通过分析线程的堆栈信息,可以判断是否存在死锁现象。

在实际应用中,以下场景可以使用jstack命令:

  1. 性能诊断:分析线程执行过程中的资源消耗,定位性能瓶颈。
  2. 问题定位:通过分析线程的堆栈信息,定位线程执行过程中的问题。
  3. 线程分析:了解线程的执行状态和方法调用,优化线程设计。

总之,jstack是JVM中一个非常有用的命令行工具,可以帮助我们更好地了解线程的执行状态,进行性能诊断和问题定位。在实际开发过程中,熟练掌握jstack命令,将有助于提高我们的开发效率。

命令参数 命令说明 示例
-l 打印线程的堆栈信息,包括Java方法调用栈和本地方法调用栈 jstack -l <pid>
-F 如果jstack命令没有响应,强制打印线程堆栈信息 jstack -F -l <pid>
-m 打印本地方法栈信息 jstack -m <pid>
-f 打印关于Java线程和本地线程的信息,包括线程ID、状态、堆栈信息等 jstack -f <pid>
-t 打印线程ID和线程名称 jstack -t <pid>
-v 打印JVM的启动参数和系统属性 jstack -v <pid>
-h 显示帮助信息 jstack -h

在使用jstack命令时,了解各个参数的具体作用对于调试Java应用程序中的线程问题至关重要。例如,使用“-l”参数可以详细打印线程的堆栈信息,这对于分析线程的执行流程非常有帮助。然而,当jstack命令没有响应时,可以通过“-F”参数强制打印线程堆栈信息,这对于紧急情况下的故障排查尤为有效。此外,对于需要了解本地方法栈信息的场景,可以使用“-m”参数来获取。在处理复杂问题时,使用“-f”参数可以同时查看Java线程和本地线程的详细信息,包括线程ID、状态和堆栈信息。对于需要查看JVM启动参数和系统属性的场合,则可以使用“-v”参数。最后,若需要获取帮助信息,只需使用“-h”参数即可。这些参数的灵活运用,将大大提高问题诊断的效率和准确性。

JVM核心知识点之jstack:适用场景

在Java虚拟机(JVM)的日常运维和问题诊断中,jstack工具扮演着至关重要的角色。它能够帮助我们深入理解JVM中线程的运行状态,从而为问题诊断和性能优化提供有力支持。本文将围绕jstack的适用场景进行详细阐述。

首先,让我们想象一下这样一个场景:在生产环境中,系统突然出现响应缓慢甚至崩溃的情况。此时,我们需要快速定位问题所在。jstack工具可以帮助我们获取当前JVM中所有线程的堆栈跟踪信息,从而分析线程的执行路径和状态。

具体来说,以下是一些jstack的适用场景:

  1. 线程死锁检测:通过分析线程的堆栈跟踪,我们可以判断是否存在死锁现象。例如,以下代码片段展示了死锁的堆栈跟踪信息:
public class DeadlockDemo {
    public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = new Object();

        Thread t1 = new Thread(() -> {
            synchronized (o1) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println("t1 finished");
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (o2) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println("t2 finished");
                }
            }
        });

        t1.start();
        t2.start();
    }
}

通过jstack获取的堆栈跟踪信息,我们可以发现t1t2线程分别阻塞在synchronized块上,导致死锁。

  1. 线程资源占用分析jstack可以帮助我们了解线程在执行过程中占用的资源情况。例如,以下代码片段展示了线程在执行过程中占用CPU资源的情况:
public class ResourceUsageDemo {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (true) {
                System.out.println("Thread is running...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t.start();
    }
}

通过jstack获取的堆栈跟踪信息,我们可以发现线程在执行过程中持续占用CPU资源,导致系统响应缓慢。

  1. 线程执行路径分析jstack可以帮助我们分析线程的执行路径,从而定位问题所在。例如,以下代码片段展示了线程在执行过程中出现异常的情况:
public class ExecutionPathDemo {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                throw new RuntimeException("Exception occurred");
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        });

        t.start();
    }
}

通过jstack获取的堆栈跟踪信息,我们可以发现线程在执行过程中抛出了异常,从而定位问题所在。

  1. 系统稳定性保障:在生产环境中,定期使用jstack对系统进行监控,可以帮助我们及时发现潜在问题,保障系统稳定性。

  2. 生产环境应用:在实际生产环境中,jstack广泛应用于问题诊断、性能优化等方面,为Java应用提供有力支持。

总之,jstack作为JVM的核心工具之一,在问题诊断和性能优化方面发挥着重要作用。通过深入理解其适用场景,我们可以更好地利用jstack解决实际问题。

适用场景 场景描述 示例代码 jstack功能应用
线程死锁检测 诊断系统中是否存在死锁,通过分析线程堆栈跟踪信息判断线程状态。 DeadlockDemo.java 分析死锁线程的堆栈跟踪,定位死锁点。
线程资源占用分析 了解线程在执行过程中占用的资源情况,如CPU资源。 ResourceUsageDemo.java 分析线程资源占用情况,定位资源瓶颈。
线程执行路径分析 分析线程的执行路径,定位问题所在。 ExecutionPathDemo.java 分析线程执行路径,定位异常点。
系统稳定性保障 定期监控系统,及时发现潜在问题,保障系统稳定性。 无特定代码,需定期执行jstack命令。 定期检查系统线程状态,预防问题发生。
生产环境应用 在生产环境中,用于问题诊断、性能优化等。 无特定代码,jstack命令在生产环境中广泛应用。 问题诊断、性能优化,提升系统性能。
JVM问题诊断 诊断JVM运行过程中出现的问题,如内存泄漏、线程问题等。 无特定代码,针对具体问题使用jstack命令。 分析JVM问题,定位问题原因。
JVM性能优化 通过分析JVM性能数据,优化系统性能。 无特定代码,针对性能瓶颈使用jstack命令。 优化JVM性能,提升系统响应速度。

在进行线程死锁检测时,除了分析线程堆栈跟踪信息,还可以结合线程间的依赖关系,通过可视化工具更直观地展示死锁情况,帮助开发者快速定位问题。例如,使用ThreadSanitizer工具可以检测死锁,并通过图形化界面展示线程间的交互关系,使得问题诊断更加高效。此外,对于复杂的死锁问题,还可以通过模拟线程执行过程,预测死锁发生的位置,从而提前采取措施避免死锁的发生。

🍊 JVM核心知识点之jstack:使用方法

在软件开发过程中,JVM(Java虚拟机)的性能调优是至关重要的。特别是在复杂的应用场景中,JVM的运行状态直接影响到系统的稳定性和效率。一个常见的场景是,当系统出现性能瓶颈或异常时,开发者需要快速定位问题所在。此时,jstack命令就成为了开发者手中的利器。

jstack是JVM自带的命令行工具,用于打印指定进程ID或核心文件中所有线程的堆栈跟踪信息。通过分析这些堆栈信息,开发者可以了解线程的运行状态,从而诊断出程序中的死锁、线程阻塞等问题。在大型分布式系统中,这种能力尤为重要,因为它可以帮助开发者快速定位问题,减少系统故障带来的损失。

介绍jstack的使用方法,其重要性和实用性不言而喻。首先,它可以帮助开发者了解JVM中线程的运行情况,从而优化程序性能。其次,通过分析堆栈信息,可以找出程序中的潜在问题,如死锁、线程饥饿等,避免这些问题在系统运行过程中引发严重后果。最后,jstack的易用性和高效性使其成为JVM性能调优的必备工具。

接下来,我们将详细介绍jstack的命令格式、参数说明以及常见命令示例。首先,我们将介绍jstack的基本命令格式,包括如何指定进程ID或核心文件。然后,我们将逐一解释各个参数的含义,帮助读者更好地理解jstack的用法。最后,我们将通过一些实际案例,展示如何使用jstack解决实际问题。

通过本节内容的学习,读者将能够熟练运用jstack命令,对JVM中的线程状态进行深入分析,从而提高JVM的性能和稳定性。这不仅有助于提升开发效率,还能为系统维护和故障排查提供有力支持。

// 以下为jstack命令的示例代码
public class JStackExample {
    public static void main(String[] args) {
        // 获取当前JVM的堆栈跟踪信息
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        // 遍历堆栈跟踪信息
        for (StackTraceElement element : stackTraceElements) {
            // 输出线程信息
            System.out.println("ClassName: " + element.getClassName());
            System.out.println("MethodName: " + element.getMethodName());
            System.out.println("FileName: " + element.getFileName());
            System.out.println("LineNumber: " + element.getLineNumber());
            System.out.println();
        }
    }
}

jstack命令是JVM自带的命令行工具,用于打印指定进程ID或核心文件中所有线程的堆栈跟踪信息。通过分析堆栈跟踪信息,可以了解线程的执行状态,从而帮助开发者定位和解决程序中的问题。

🎉 命令格式

jstack命令的基本格式如下:

jstack [options] pid

其中,[options]表示可选的命令行参数,pid表示需要打印堆栈跟踪信息的进程ID。

🎉 线程状态

jstack命令输出的线程信息中,线程状态包括以下几种:

  • R (Running): 线程正在执行中。
  • B (Blocked): 线程正在等待某个资源,如锁。
  • W (Waiting): 线程正在等待某个事件发生,如条件变量。
  • T (Timed Waiting): 线程正在等待某个事件发生,但设置了超时时间。
  • Z (Dead): 线程已经结束执行。
  • X (Terminated): 线程被外部强制终止。

🎉 堆栈跟踪

jstack命令输出的堆栈跟踪信息包括线程的调用栈,即线程在执行过程中调用的方法。通过分析堆栈跟踪信息,可以了解线程的执行流程,从而定位问题。

🎉 线程信息输出

jstack命令输出的线程信息包括线程ID、线程名称、线程状态、堆栈跟踪等。以下是一个示例输出:

"main" #1 prio=5 os_prio=0 tid=0x00007f9c8c0a3000 nid=0x1a2 waiting on condition [0x00007f9c8c0a0000]
   java.lang.Thread.State: WAITING
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:502)
        at java.util.concurrent.locks.ReentrantLock$Condition.await(ReentrantLock.java:2039)
        at com.example.Main.main(Main.java:10)

🎉 命令行参数

jstack命令支持以下命令行参数:

  • -F:强制打印堆栈跟踪信息,即使进程没有响应。
  • -l:打印线程的堆栈跟踪信息,包括同步信息。
  • -m:打印线程的堆栈跟踪信息,包括本地方法栈。
  • -h:打印帮助信息。

🎉 使用方法

  1. 使用jstack命令打印指定进程的堆栈跟踪信息:
jstack 1234
  1. 使用jstack命令打印指定进程的堆栈跟踪信息,并强制打印:
jstack -F 1234

🎉 常见问题解决

  1. 进程没有响应:使用-F参数强制打印堆栈跟踪信息。
  2. 线程信息不完整:使用-l-m参数打印更详细的线程信息。

🎉 性能分析

jstack命令可以用于分析线程的性能问题,如死锁、线程饥饿等。通过分析线程的堆栈跟踪信息,可以了解线程的执行状态,从而定位和解决性能问题。

🎉 故障排查

jstack命令可以用于排查程序中的故障,如线程异常、死

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值