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 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线程会监听这个文件,有信息就解析,执行,返回。

你可能感兴趣的:(Attach机制)