`

Java 工具(jmap,jstack)在linux上的源码分析(二)信号处理

 
阅读更多

当java虚拟机启动的时候,会启动很多内部的线程,这些线程主要在thread.cpp里的create_vm方法体里实现

而在thread.cpp里主要起了2个线程来处理信号相关的


1. Signal Dispatcher 线程

在os.cpp中的signal_init()函数中,启动了signal dispatcher 线程,对signal dispather 线程主要是用于处理信号,等待信号并且分发处理,可以详细看signal_thread_entry的方法


可以看到通过os::signal_wait();等待信号,而在linux里是通过sem_wait()来实现,接受到SIGBREAK(linux 中的QUIT)信号的时候(关于信号处理请参考笔者的另一篇博客:java 中关于信号的处理在linux下的实现),第一次通过调用 AttachListener::is_init_trigger()初始化attach listener线程,详细见2.Attach Listener 线程。

  1. 第一次收到信号,会开始初始化,当初始化成功,将会直接返回,而且不返回任何线程stack的信息(通过socket file的操作返回),并且第二次将不在需要初始化。如果初始化不成功,将直接在控制台的outputstream中打印线程栈信息。
  2. 第二次收到信号,如果已经初始化过,将直接在控制台中打印线程的栈信息。如果没有初始化,继续初始化,走和第一次相同的流程。

2. Attach Listener 线程

Attach Listener 线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。在jvm启动的时候,如果没有指定+StartAttachListener,该线程是不会启动的,刚才我们讨论到了在接受到quit信号之后,会调用 AttachListener::is_init_trigger()通过调用用AttachListener::init()启动了Attach Listener 线程,同时在不同的操作系统下初始化,在linux中 是在attachListener_Linux.cpp文件中实现的。

在linux中如果发现文件.attach_pid#pid存在,才会启动attach listener线程,同时初始化了socket 文件,也就是通常jmap,jstack tool干的事情,先创立attach_pid#pid文件,然后发quit信号,通过这种方式暗式的启动了Attach Listener线程(见博客:http://blog.csdn.net/raintungli/article/details/7023092)。

线程的实现在 attach_listener_thread_entry 方法体中实现

在AttachListener::dequeue(); 在liunx里的实现就是监听刚才创建的socket的文件,如果有请求进来,找到请求对应的操作,调用操作得到结果并把结果写到这个socket的文件,如果你把socket的文件删除,jstack/jmap会出现错误信息 unable to open socket file:........

我们经常使用kill -3 pid的操作打印出线程栈信息,我们可以看到具体的实现是在Signal Dispatcher 线程中完成的,因为kill -3 pid 并不会创建.attach_pid#pid文件,所以一直初始化不成功,从而线程的栈信息被打印到控制台中。

分享到:
评论

相关推荐

    Kubernetes应用java程序无法使用jmap,jstack的解决方案.docx

    在 Kubernetes 环境中,运行 Java 程序时,无法使用 jmap 和 jstack 命令进行性能分析和诊断。这种情况下,无法获取 Java 进程的 pid,导致无法使用 jmap 和 jstack 命令。 解决方案: 1. 了解 Linux 特殊进程 在 ...

    java使用JMAP定位代码内存泄漏在哪

    Java编程语言在处理大型应用程序时,内存管理是一个至关重要的环节。内存泄漏是导致程序性能下降,甚至引发Out of Memory (OOM)错误的主要原因之一。本文将详细介绍如何使用JMAP工具来定位Java代码中的内存泄漏问题...

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解.docx

    JVM性能调优监控工具jps、jstack、jmap、jhat、...jps、jstack、jmap、jhat、jstat 等 JVM 性能调优监控工具对于 Java 程序员来说是必备的,能够帮助我们解决各种 JVM 性能问题,提高 Java 应用程序的性能和稳定性。

    JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    jstack工具目前仅在Solaris和Linux的JDK版本中提供。 jconsole jconsole是一个基于Java Management Extensions (JMX)的实时图形化监测工具。该工具利用了内建到JVM中的JMX指令,提供实时的性能和资源的监控,包括...

    JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc

    上述工具共同构成了Java开发者和运维人员的有力武器库,帮助他们在面对复杂多变的JVM问题时能够迅速定位、分析并解决问题。每一种工具都有其独特的优势和适用场景,了解并熟练运用它们,将极大地提升处理Java应用...

    jmap、jstack、jstat组合使用定位jvm问题.txt

    jmap、jstack、jstat组合使用定位jvm问题

    java诊断与调优常用命令jmap、jstack、jstat使用实战.pdf

    本文主要介绍了四个Java命令行工具:jps、jmap、jstack和jstat,它们是Java性能分析和故障排查的基础。 1. **jps (Java Process Status)**: 用于查看运行在本地机器上的Java进程ID,这对于其他命令来说是必需的输入...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    `jmap -dump:format=b,file=<filename> <pid>`命令会生成一个二进制格式的堆转储文件,这对于分析大型系统的内存使用情况特别有用。 `jdb`是Java的调试器,它允许开发者在运行时对代码进行单步调试、设置断点、查看...

    jmap Eclipse内存分析工具.rar

    1. **生成堆转储(Heap Dump)**: 使用`jmap -dump`命令,可以在运行时将Java堆的完整状态导出为一个二进制文件,通常以`.hprof`为扩展名。 2. **堆统计信息**: `jmap -histo`可以打印出堆中对象的数量和大小的直方...

    通过jstack与jmap分析一次线上故障.pdf

    通过jstack与jmap分析一次线上故障.pdf

    java dump分析工具ha456

    本文将详细探讨Java内存分析、dump分析、jmap和jstack工具的使用,以及如何利用这些工具进行堆栈分析。 首先,Java内存分析主要关注的是程序运行时的内存分配和管理。Java内存分为堆内存(Heap)、栈内存(Stack)...

    Linux下启动JAVA

    在Linux上使用Java首先需要安装Java Development Kit (JDK)或Java Runtime Environment (JRE)。通常,可以通过官方Oracle JDK或开源的OpenJDK进行安装。在Ubuntu/Debian上,可以使用`apt-get`命令: ```bash ...

    最新Java JDK 8安装版(Linux 64位)

    同时,JDK还包含`javadoc`工具用于生成API文档,`jps`、`jstack`、`jmap`等用于监控和诊断Java进程。 总之,"最新Java JDK 8安装版(Linux 64位)"为Linux开发者提供了稳定可靠的开发环境,结合其新特性和改进的API...

    Java内存泄露_JVM监控工具介绍

    jstack命令是一个强大的工具,用于分析Java程序的崩溃原因和堆栈信息。它可以将core文件转换为人类可读的格式,方便开发者快速定位问题所在。如果Java程序崩溃生成core文件,jstack工具可以用来获得core文件的Java栈...

    java在linux下的配置

    `JDK`自带了一些实用工具,如`jps`(Java进程查看器),`jinfo`(获取Java进程配置信息),`jmap`(内存映射工具),`jstack`(线程堆栈跟踪)等。这些工具可以帮助开发者进行性能监控和问题排查。 除此之外,`...

    亲测可用java-1.8.0-openjdk.linux.x86_64.zip

    4. **其他开发工具**:OpenJDK 1.8.0还包括其他的开发工具,如`jmap`用于内存映射,`jhat`用于分析堆转储,`jinfo`获取Java配置信息,`jstack`用于查看线程堆栈跟踪,以及`jconsole`图形化监控工具等。这些工具对于...

    Java SE 8u251 Linux安装包

    在Java开发中,理解JDK提供的工具非常重要,例如`javac`用于编译Java源代码,`javadoc`生成API文档,`jar`工具用于打包和管理类库,还有`jps`、`jmap`、`jconsole`等用于诊断和监控Java应用程序。 Java SE 8引入了...

    java_on_linux

    首先,Java在Linux上的安装主要有两种方式:通过软件包管理器(如apt-get或yum)或者直接下载JDK/JRE的二进制文件。使用软件包管理器的好处是方便、自动化,而直接下载则可以获取特定版本的Java。安装完成后,需要...

    IBM内存分析工具(java)

    通过`jmap -dump:format=b,file=<dump_file>`命令,我们可以将JVM的内存状态导出为二进制格式的dump文件,这是IBM内存分析工具分析的基础。 4. **MAT的分析功能** - **内存泄漏探测器**:MAT可以检测出对象实例的...

Global site tag (gtag.js) - Google Analytics