在前面的博客中(http://blog.csdn.net/raintungli/article/details/7034005)所提到的信号转发线程,Attach Listener 线程都只是操作socket文件,并没有去执行比如stack 分析,或者heap的分析,真正的工作线程其实是vm thread.
(一)启动vm thread
我们可以看到,在thread.cpp里启动了线程vm thread,在这里我们同时也稍微的略带的讲一下jvm在linux里如何启动线程的。
通常在linux中启动线程,是调用
而在java里却增加了os:create_thread --初始化线程 和os:start_thread--启动线程
我们去看一下jvm里面是如何在linux里做到的
在os_linux.cpp中来看create_thread的方法
继续看java_start方法
首先jvm先设置了当前线程的状态是Initialized, 然后notify所有的线程,
while (osthread->get_state() == INITIALIZED) {
sync->wait(Mutex::_no_safepoint_check_flag);
}
不停的查看线程的当前状态是不是Initialized, 如果是的话,调用了sync->wait()的方法等待。
来看os:start_thread的方法 os.cpp
这时候设置了线程的状态为runnable,但没有notify线程
在 pd_start_thread(thread)中, os_linux.cpp中
这时候我们看到了notify 线程的操作
也就是这时候notify了线程,因为这时候的线程的状态是RUNNABLE, 方法java_start继续往下执行,于是调用了thread->run()的方法
对于线程vm Thread 也就是调用了vmthread::run方法
vmThread.cpp
调用了loop函数,处理了VM_Operation 的queue 关于queue的级别和优先级处理算法:可以参考 另一篇博客:http://blog.csdn.net/raintungli/article/details/6553337
(二)Jstack 运行在vm thread里的VM_Operation
jstack 处理也就是在前面博客所提到的attach Listener 线程所做的 operation
简单看一下类VM_PrintThreads 它 继承了VM_Operation
当调用VMThread::execute()也就是将VM_PrintThreads 放入了_vm_queue中,交给vm thread 处理,对vm thread来说取出queue里的VM_Operation,并且调用doit方法。
在jstack里,attach listener 的线程产生了VM_PrintThreads,VM_PrintJNI,VM_FindDeadlocks 3个operations,交给了vm thread 的线程处理。
分享到:
相关推荐
在 Kubernetes 环境中,运行 Java 程序时,无法使用 jmap 和 jstack 命令进行性能分析和诊断。这种情况下,无法获取 Java 进程的 pid,导致无法使用 jmap 和 jstack 命令。 解决方案: 1. 了解 Linux 特殊进程 在 ...
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...
JMAP是Java自带的一个命令行工具,它提供了对Java堆内存的详细分析功能,可以帮助我们诊断内存泄漏。JMAP的主要功能包括: 1. **生成堆转储文件**:通过`jmap -dump:format=b,file=<filename> <pid>`命令,我们可以...
jstack工具目前仅在Solaris和Linux的JDK版本中提供。 jconsole jconsole是一个基于Java Management Extensions (JMX)的实时图形化监测工具。该工具利用了内建到JVM中的JMX指令,提供实时的性能和资源的监控,包括...
`jstack` 是一个强大的工具,用于获取Java应用的线程堆栈信息。当Java程序出现异常或挂起时,`jstack` 可以帮助分析程序状态,找出导致问题的代码位置。它不仅能读取当前运行进程的堆栈信息,还能解析由程序崩溃时...
本文主要介绍了四个Java命令行工具:jps、jmap、jstack和jstat,它们是Java性能分析和故障排查的基础。 1. **jps (Java Process Status)**: 用于查看运行在本地机器上的Java进程ID,这对于其他命令来说是必需的输入...
首先,`jstack`是一个用于打印Java线程堆栈跟踪的工具。当应用出现死锁或者线程阻塞时,jstack可以帮助我们查看各个线程的状态,找出问题所在。通过`jstack <pid>`命令,我们可以获取到Java进程的详细线程信息,包括...
jmap、jstack、jstat组合使用定位jvm问题
这些工具包括IBM Thread and Monitor Dump Analyzer for Java、HeapAnalyzer以及可能的GA441(可能是另一个内存分析工具的简称,但未提供详细信息)。以下将详细介绍这些工具的功能和使用方法。 **IBM Thread and ...
线程 Dump 分析是 IT 系统性能优化中不可或缺的一部分,尤其在 Java 应用程序中,当系统出现响应慢或者卡死等异常情况时,通过获取和分析线程 Dump 文件,我们可以找出导致问题的线程,定位内存泄漏、死锁等问题。...
本文将详细探讨Java内存分析、dump分析、jmap和jstack工具的使用,以及如何利用这些工具进行堆栈分析。 首先,Java内存分析主要关注的是程序运行时的内存分配和管理。Java内存分为堆内存(Heap)、栈内存(Stack)...
**jmap Eclipse内存分析工具详解** 在Java开发中,内存管理是至关重要的,尤其是在大型应用或者长时间运行的服务中,内存泄漏可能导致系统性能下降甚至崩溃。为了有效地检测和诊断内存问题,Oracle提供了`jmap`...
为了监控Java应用的性能,可以使用`jps`(Java进程状态)列出运行中的Java进程,`jstat`(JVM统计监测工具)查看JVM的统计信息,`jmap`(内存映射工具)生成堆转储,以及`jhat`(堆分析工具)分析堆转储。...
通过jstack与jmap分析一次线上故障.pdf
`JDK`自带了一些实用工具,如`jps`(Java进程查看器),`jinfo`(获取Java进程配置信息),`jmap`(内存映射工具),`jstack`(线程堆栈跟踪)等。这些工具可以帮助开发者进行性能监控和问题排查。 除此之外,`...
jstack可以获取Java进程的线程堆栈轨迹,这对于分析死锁和长时间运行的线程等问题非常有用。 #### 九、jstat工具 jstat是一个命令行工具,用于显示JVM的统计信息,包括GC活动、堆内存使用等。 #### 十、visualgc...
8. **安装过程**:在Linux系统上安装JDK 8通常涉及解压下载的文件,设置环境变量如`JAVA_HOME`,并将路径添加到`PATH`变量中,确保系统能够找到并执行Java命令。 9. **开发和运行Java程序**:安装完成后,开发者...
jstack命令是一个强大的工具,用于分析Java程序的崩溃原因和堆栈信息。它可以将core文件转换为人类可读的格式,方便开发者快速定位问题所在。如果Java程序崩溃生成core文件,jstack工具可以用来获得core文件的Java栈...
在Java中,有一些内置的工具可以用来监控和分析性能,包括内存使用、垃圾回收等方面。 首先,`jps`命令类似于Linux的`ps`命令,用于列出本地正在运行的Java进程ID。`jstat`工具则可以提供虚拟机(VM)的各种统计...