小手记之HotSpot Attach机制

前面文章我们已经提到过了JDK自带的jstack是使用的Dynamic Attach机制。下面是官方文档对该机制的描述,

This is a Sun private mechanism that allows an external process to start a thread in HotSpot that can then be used to launch an agent to run in that HotSpot, and to send information about the state of HotSpot back to the external process.

那么现在的问题也就变成了external process跟target VM process间的IPC问题了,那么到底是使用了什么样的IPC方式呢,

On Linux and Solaris, the client creates a file named .attach_pid<pid> and sends a SIGQUIT to the target JVM process. The existence of this file causes the SIGQUIT handler in HotSpot to start the attach listener thread. On Windows, the client uses the Win32 CreateRemoteThread function to create a new thread in the target process. The attach listener thread then communicates with the source JVM in an OS dependent manner:

  • On Solaris, the Doors IPC mechanism is used. The door is attached to a file in the file system so that clients can access it.
  • On Linux, a Unix domain socket is used. This socket is bound to a file in the filesystem so that clients can access it.
  • On Windows, the created thread is given the name of a pipe which is served by the client. The result of the operations are written to this pipe by the target JVM.

也就是说,以Linux平台为栗,使用了两种IPC方式,

  1. 信号机制。首先external process会先发送一个SIGQUIT信号给target VM process,target VM会创建一个Attach Listener线程;
  2. Unix domain socket。然后Attach Listener线程会通过Unix domain socket与external process建立连接,之后就可以基于这个socket进行通信了。

这个过程中,会有两个文件被创建,

  • .attach_pid<pid>,external process会创建这个文件,为的是触发Attach Listener线程的创建,因为SIGQUIT信号不是只有external process才会发的,通过这个文件来告诉target VM,有attach请求过来了。相关代码在LinuxVirtualMachine.java中;
  • .java_pid<pid>,target VM会创建这个文件,这个是因为Unix domain socket本身的实现机制需要去创建一个文件,通过这个文件来进行IPC。相关代码在attachListener_linux.cpp中;

其中的<pid>都是target VM的pid。

参考资料

时间: 2024-08-04 05:48:14

小手记之HotSpot Attach机制的相关文章

HotSpot Attach 机制小结

前面文章我们已经提到过了JDK自带的jstack是使用的Dynamic Attach机制.下面是官方文档对该机制的描述, This is a Sun private mechanism that allows an external process to start a thread in HotSpot that can then be used to launch an agent to run in that HotSpot, and to send information about t

小程序的加载机制和运行机制

一.运行机制 冷启动指的是重新启动,热启动指的是5分钟内从后台切换到前台,只有冷启动才能加载最新的包. 小程序什么时候会关闭? 5min后台运行,连续收到两次(2s)系统告警. 二.加载机制 三.小程序的应用生命周期 四.小程序页面的生命周期 原文地址:https://www.cnblogs.com/xietianjiao/p/11937530.html

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

微信小程序启动、更新机制

小程序启动 小程序启动会有两种情况,一种是「冷启动」,一种是「热启动」. 热启动:假如用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时无需重新启动,只需将后台态的小程序切换到前台,这个过程就是热启动:冷启动:用户首次打开或小程序被微信主动销毁后再次打开的情况,此时小程序需要重新加载启动,即冷启动.小程序没有重启的概念. 小程序冷启动时,如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上. const updat

小手记之与运算代替模运算

等式 先抛出一个等式, X & (2n?1) == X % 2n 右边式子,也就是模运算,最后的结果为[0, 2n?1],而左边的式子,也就是与运算,可以将X的高位清掉,最后剩下的是X的[0, n)位上面的数值,这个值当然也是∈[0, 2n?1],所以左右两边是相等的. 对比 模运算经常用来做哈希,利用上面的等式,我们完全可以使用与运算来代替模运算, 好处,与运算要比模运算来得快: 限制,模数必须是2的次幂: 参考资料 http://ifeve.com/dissecting-disruptor-

小例子分析C#继承机制

using System; class test { public class A { public virtual void fun1(int i) { Console.WriteLine(i); } public void fun2(A a) { a.fun1(3); fun1(7); } } public class B : A { public override void fun1(int i) { Console.WriteLine(i+1); } } public static vo

Python 小数据池、代码块以及代码块缓存机制

按照惯例,吟诗一首:苏轼<江城子·乙卯正月二十日夜记梦> 十年生死两茫茫,不思量,自难忘.千里孤坟,无处话凄凉. 纵使相逢应不识,尘满面,鬓如霜. 夜来幽梦忽还乡,小轩窗,正梳妆.相顾无言,惟有泪千行. 料得年年肠断处,明月夜,短松冈. 1. is 和 == 之间的区别 在讲解代码块及其缓存机制之前有必要搞清楚is和==之间的区别 开门见山直接说:==是比较两边变量的值是否相同,is是比较两边变量的内存地址是否相同,在python中内存地址如何获取,当然是使用id(item)函数获取了 举两个

Python 中的驻留机制:小数据池和代码块

Python 中的驻留机制:小数据池和代码块 Python 中的驻留机制主要有两个:小数据池和代码块.驻留机制并不是学习 Python 过程中特别重要的概念,我们学习小数据池的目的主要有两个方面: 解决日后写代码过程中可能出现的疑惑.在后期开发中,能 明确 知道有些代码为什么不能正常使用 找工作面试时或多或少可能被问到,关键时刻起到装 X 的作用 先补充一个关键字 is.is(是) 和 ==(等于) 的作用十分相似,我们在这里将它们进行一个对比: == : 官方:判断等号两边的内容是否相同 白话

HotSpot实战

<HotSpot实战>深入浅出地讲解了HotSpot虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包括OpenJDK与HotSpot项目.编译和调试HotSpot的方法.HotSpot内核结构.Launcher.OOP-Klass对象表示系统.链接.运行时数据区.方法区.常量池和常量池Cache.Perf Data.Crash分析方法.转储分析方法.垃圾收集器的设计演进.CMS和G1收集器.栈.JVM对硬件寄存器的利用.栈顶缓存技术.解释器.字节码表.转发表.Stubs.Cod