iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >jvm JAttach机制如何实现完全解读
  • 865
分享到

jvm JAttach机制如何实现完全解读

2023-06-16 12:06:49 865人浏览 安东尼
摘要

JVM JAttach机制如何实现完全解读,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Attach是什么在讲这个之前,我们先来点大家都知道的东西,当我们感觉线

JVM JAttach机制如何实现完全解读,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Attach是什么

在讲这个之前,我们先来点大家都知道的东西,当我们感觉线程一直卡在某个地方,想知道卡在哪里,首先想到的是进行线程dump,而常用的命令是jstack ,我们就可以看到如下线程栈了

jvm JAttach机制如何实现完全解读

大家是否注意过上面圈起来的两个线程,”Attach Listener”和“Signal Dispatcher”,这两个线程是我们这次要讲的Attach机制的关键,先偷偷告诉各位,其实Attach Listener这个线程在jvm起来的时候可能并没有的,后面会细说。

那Attach机制是什么?说简单点就是jvm提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程,并让它执行内部的一些操作,比如说我们为了让另外一个jvm进程把线程dump出来,那么我们跑了一个jstack的进程,然后传了个pid的参数,告诉它要哪个进程进行线程dump,既然是两个进程,那肯定涉及到进程间通信,以及传输协议的定义,比如要执行什么操作,传了什么参数等

Attach能做些什么

总结起来说,比如内存dump,线程dump,类信息统计(比如加载的类及大小以及实例个数等),动态加载agent(使用过btrace的应该不陌生),动态设置vm flag(但是并不是所有的flag都可以设置的,因为有些flag是在jvm启动过程中使用的,是一次性的),打印vm flag,获取系统属性等,这些对应的源码(AttachListener.cpp)如下

static AttachOperationFunctionInfo funcs[] = {    { "agentProperties",  get_agent_properties },    { "datadump",         data_dump },    { "dumpheap",         dump_heap },    { "load",             JvmtiExport::load_agent_library },    { "properties",       get_system_properties },    { "threaddump",       thread_dump },    { "inspectheap",      heap_inspection },    { "setflag",          set_flag },    { "printflag",        print_flag },    { "jcmd",             jcmd },    { NULL,               NULL }  };

后面是命令对应的处理函数。

Attach在jvm里如何实现的

Attach Listener线程的创建

前面也提到了,jvm在启动过程中可能并没有启动Attach Listener这个线程,可以通过jvm参数来启动,代码 (Threads::create_vm)如下:

if (!DisableAttachMechanism) {     if (StartAttachListener || AttachListener::init_at_startup()) {       AttachListener::init();     }   }  ool AttachListener::init_at_startup() {   if (ReduceSignalUsage) {     return true;   } else {     return false;   }

其中DisableAttachMechanism,StartAttachListener ,ReduceSignalUsage均默认是false(globals.hpp)

product(bool, DisableAttachMechanism, false,                                   "Disable mechanism that allows tools to Attach to this VM”)     product(bool, StartAttachListener, false,                                           "Always start Attach Listener at VM startup")    product(bool, ReduceSignalUsage, false,                                               "Reduce the use of OS signals in Java and/or the VM”)

因此AttachListener::init()并不会被执行,而Attach Listener线程正是在此方法里创建的

jvm JAttach机制如何实现完全解读

既然在启动的时候不会创建这个线程,那么我们在上面看到的那个线程是怎么创建的呢,这个就要关注另外一个线程“Signal Dispatcher”了,顾名思义是处理信号的,这个线程是在jvm启动的时候就会创建的,具体代码就不说了。

下面以jstack的实现来说明触发Attach这一机制进行的过程,jstack命令的实现其实是一个叫做JStack.java的类,查看jstack代码后会走到下面的方法里

jvm JAttach机制如何实现完全解读

请注意VirtualMachine.Attach(pid);这行代码,触发Attach pid的关键,如果是在linux下会走到下面的构造函数

jvm JAttach机制如何实现完全解读

这里要解释下代码了,首先看到调用了createAttachFile方法在目标进程的cwd目录下创建了一个文件/proc//cwd/.Attach_pid,这个在后面的信号处理过程中会取出来做判断(为了安全),另外我们知道在linux下线程是用进程实现的,在jvm启动过程中会创建很多线程,比如我们上面的信号线程,也就是会看到很多的pid(应该是LWP),那么如何找到这个信号处理线程呢,从上面实现来看是找到我们传进去的pid的父进程,然后给它的所有子进程都发送一个SIGQUIT信号,而jvm里除了信号线程,其他线程都设置了对此信号的屏蔽,因此收不到该信号,于是该信号就传给了“Signal Dispatcher”,在传完之后作轮询等待看目标进程是否创建了某个文件,AttachTimeout默认超时时间是5000ms,可通过设置系统变量sun.tools.Attach.AttachTimeout来指定,下面是Signal Dispatcher线程的entry实现

jvm JAttach机制如何实现完全解读

当信号是SIGBREAK(在jvm里做了#define,其实就是SIGQUIT)的时候,就会触发

AttachListener::is_init_trigger()的执行

jvm JAttach机制如何实现完全解读

一开始会判断当前进程目录下是否有个.Attach_pid文件(前面提到了),如果没有就会在/tmp下创建一个/tmp/.Attach_pid,当那个文件的uid和自己的uid是一致的情况下(为了安全)再调用init方法

jvm JAttach机制如何实现完全解读

此时水落石出了,看到创建了一个线程,并且取名为Attach Listener。再看看其子类LinuxAttachListener的init方法

jvm JAttach机制如何实现完全解读

看到其创建了一个监听套接字,并创建了一个文件/tmp/.java_pid,这个文件就是客户端之前一直在轮询等待的文件,随着这个文件的生成,意味着Attach的过程圆满结束了。

Attach listener接收请求

看看它的entry实现Attach_listener_thread_entry

jvm JAttach机制如何实现完全解读

从代码来看就是从队列里不断取AttachOperation,然后找到请求命令对应的方法进行执行,比如我们一开始说的jstack命令,找到 { “threaddump”, thread_dump }的映射关系,然后执行thread_dump方法

再来看看其要调用的AttachListener::dequeue(),

AttachOperation* AttachListener::dequeue() {    JavaThread* thread = JavaThread::current();    ThreadBlockInVM tbivm(thread);    thread->set_suspend_equivalent();    // cleared by handle_special_suspend_equivalent_condition() or    // java_suspend_self() via check_and_wait_while_suspended()    AttachOperation* op = LinuxAttachListener::dequeue();    // were we externally suspended while we were waiting?    thread->check_and_wait_while_suspended();    return op;  }

最终调用的是LinuxAttachListener::dequeue(),

jvm JAttach机制如何实现完全解读

我们看到如果没有请求的话,会一直accept在那里,当来了请求,然后就会创建一个套接字,并读取数据,构建出LinuxAttachOperation返回并执行。

整个过程就这样了,从Attach线程创建到接收请求,处理请求。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: jvm JAttach机制如何实现完全解读

本文链接: https://www.lsjlt.com/news/283457.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • jvm JAttach机制如何实现完全解读
    jvm JAttach机制如何实现完全解读,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Attach是什么在讲这个之前,我们先来点大家都知道的东西,当我们感觉线...
    99+
    2023-06-16
  • 如何实现完全解析HugePages
    这期内容当中小编将会给大家带来有关如何实现完全解析HugePages,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。本文使用 Linux 内核 2.6.23 版本HugePages分配器初始化在内核初始化时...
    99+
    2023-06-15
  • python如何实现完全数
    目录python实现完全数Python求找出1000以内所有的“完数”总结python实现完全数 求出1000以内的完全数。 所谓完全数是指,如果一个数恰好等...
    99+
    2022-12-20
    python实现完全数 python完全数 完全数
  • RMAN如何实现完全恢复错误
    这篇文章主要为大家展示了“RMAN如何实现完全恢复错误”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“RMAN如何实现完全恢复错误”这篇文章吧。RMAN恢复案例:...
    99+
    2024-04-02
  • checkpoint机制如何实现
    这篇文章主要讲解了“checkpoint机制如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“checkpoint机制如何实现”吧!checkpoint 机制的具体实现我们都知道为了优化...
    99+
    2023-07-05
  • 如何理解Spring AOP的实现机制
    这篇文章将为大家详细讲解有关如何理解Spring AOP的实现机制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。AOP(Aspect Orient Programming),一般称为面向切面...
    99+
    2023-06-16
  • 透彻解读Go语言切片的实现机制
    Go语言作为一种快速、高效的编程语言,提供了丰富的数据结构和操作方式,其中切片(Slice)是Go语言中非常重要且常用的一种数据结构。本文将深入探讨Go语言切片的实现机制,为读者详细解...
    99+
    2024-04-02
  • 批处理如何实现延时不完全
    这篇文章给大家分享的是有关批处理如何实现延时不完全的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、利用ping命令实现延时,方法巧妙而且可以控制,但精度不高。 如:ping -n 3 127.0.0.1>...
    99+
    2023-06-09
  • spring redis注解如何实现缓存机制
    这篇文章给大家分享的是有关spring redis注解如何实现缓存机制的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1、xml配置 <bean id="poolC...
    99+
    2024-04-02
  • Linux中如何实现poll机制
    这篇文章给大家分享的是有关Linux中如何实现poll机制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。所有的系统调用,基于都可以在它的名字前加上“sys_”前缀,这就是它在内核中对应的函数。比如系统调用open...
    99+
    2023-06-12
  • python的import机制如何实现
    本篇内容主要讲解“python的import机制如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python的import机制如何实现”吧!import 机制功能Python 的 impo...
    99+
    2023-06-30
  • 如何解读MongoDB SCRAM-SHA-1鉴权机制步骤
    这篇文章给大家介绍如何解读MongoDB SCRAM-SHA-1鉴权机制步骤,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 SCRAM-SHA-1是Mon...
    99+
    2024-04-02
  • C\C++如何实现读写二进制文件
    这篇文章主要介绍“C\C++如何实现读写二进制文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C\C++如何实现读写二进制文件”文章能帮助大家解决问题。读写二进制文件打开文件fopen() 函数用...
    99+
    2023-07-05
  • 如何解析MySQL线程池内部实现机制
    本篇文章为大家展示了如何解析MySQL线程池内部实现机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。摘要在MySQL中,线程池指的是用来管理处理MySQL客户端连...
    99+
    2024-04-02
  • java的反射机制如何实现
    Java的反射机制是指在运行时动态获取和操作类的相关信息的能力。通过反射,可以在运行时获取类的属性、方法、构造函数等信息,还可以动态...
    99+
    2023-08-31
    java
  • Node如何实现JWT鉴权机制
    这篇文章主要介绍“Node如何实现JWT鉴权机制”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node如何实现JWT鉴权机制”文章能帮助大家解决问题。一、为什么使用JWT一种技术的出现,就是弥补另一...
    99+
    2023-07-04
  • 详解JAVA如何实现乐观锁以及CAS机制
    目录前言问题引入悲观锁解决乐观锁解决乐观锁改进CAS机制总结前言 生活中我们看待一个事物总有不同的态度,比如半瓶水,悲观的人会觉得只有半瓶水了,而乐观的人则会认为还有半瓶水呢。很多技...
    99+
    2022-12-08
    JAVA乐观锁 CAS机制 JAVA乐观锁 JAVA CAS
  • Python底层技术解析:如何实现协程机制
    Python底层技术解析:如何实现协程机制引言:随着计算机软硬件的发展,提高程序执行效率的需求越来越迫切。在多线程和多进程的环境下,协程机制逐渐成为提升程序性能和并发能力的重要手段之一。本文将介绍协程机制的概念和原理,并具体讲解如何使用Py...
    99+
    2023-11-08
    Python 底层 协程
  • 解读Spring事务是如何实现的
    目录Spring事务如何实现Spring事务实现的几种方式编程式事务管理声明式事务管理总结Spring事务如何实现 1.Spring事务底层是基于数据库事务和AOP机制的 2.首先对...
    99+
    2023-03-19
    Spring事务 Spring事务实现 Spring如何实现事务
  • C语言如何实现随机读写文件
    这篇文章主要讲解了“C语言如何实现随机读写文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言如何实现随机读写文件”吧!1.fseek前面已经剧透过了,fseek可以改变记录读写位置的指...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作