Java Attach
是一种让java
进程之间进行通信的机制。比如jvm
运行时获取信息的jstack
工具就是应用Attach
的。
作用
-
获取信息
: 通过Attach机制可以获取jvm的内存dump、线程dump、类统计信息、获取vm flag、获取系统属性等。 -
动态控制程序
: 为jvm进程动态加载agent,动态设置vm flag(运行时的flag)
简单使用
- 使用
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();
}
- 相关jvm参数
jvm参数 | 默认值 | 介绍 |
---|---|---|
DisableAttachMechanism | false | 禁止Attach |
StartAttachListener | false | 程序启动时就开启Attach Listener线程,否则需要Signal Dispatcher线程唤醒 |
ReduceSignalUsage | false | 减少信号量? |
原理
每个jvm都有两个线程:
Signal Dispatcher
处理信号,Attach Listener
用于jvm进程间通信。Attach Listener
线程默认不开启,使用jvm参数可以启动时开启。否则会在Attach连接成功后开启。Attach Listener
线程启动后,就会创建一个监听套接字,并创建了一个文件/tmp/.java_pid
客户端向
java_pid
中写相关命令,Attach Listener
线程会监听这个文件,有信息就解析,执行,返回。