Attach机制

Java Attach是一种让java进程之间进行通信的机制。比如jvm运行时获取信息的jstack工具就是应用Attach的。

作用

  1. 获取信息: 通过Attach机制可以获取jvm的内存dump、线程dump、类统计信息、获取vm flag、获取系统属性等。
  2. 动态控制程序: 为jvm进程动态加载agent,动态设置vm flag(运行时的flag)

简单使用

  1. 使用com.sun.tools.attach下的相关类
public static void main(String[] args) throws IOException, AttachNotSupportedException {
        VirtualMachine attach = VirtualMachine.attach("1234");//需要连接jvm进程的pid
        List<VirtualMachineDescriptor> list = VirtualMachine.list();
        InputStream in = ((HotSpotVirtualMachine) attach).remoteDataDump((Object[]) args);
        byte b[] = new byte[256];
        int n = 0;
        do {
            n = in.read(b);
            if (n > 0) {
                System.out.println(new String(b, 0, n));
            }
        } while (n > 0);
        in.close();
        attach.detach();
    }
  1. 相关jvm参数
jvm参数 默认值 介绍
DisableAttachMechanism false 禁止Attach
StartAttachListener false 程序启动时就开启Attach Listener线程,否则需要Signal Dispatcher线程唤醒
ReduceSignalUsage false 减少信号量?

原理

  1. 每个jvm都有两个线程: Signal Dispatcher处理信号,Attach Listener用于jvm进程间通信。

  2. Attach Listener线程默认不开启,使用jvm参数可以启动时开启。否则会在Attach连接成功后开启。

  3. Attach Listener线程启动后,就会创建一个监听套接字,并创建了一个文件/tmp/.java_pid

  4. 客户端向java_pid中写相关命令,Attach Listener线程会监听这个文件,有信息就解析,执行,返回。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容