场景
在JVM运行时,我们经常需要获取目标JVM运行时的相关信息,jstack,jmap等常用工具的主要原理都和attach机制有关。
用法
- 默认不开启
- 可通过-XX:+StartAttachListener开启
实现原理
attach机制的实现涉及到了进程间的通信,每个JVM都会有Signal Dispatcher线程和Attach Listener线程,前者用于处理信号,后者用于JVM进程间的通信。
Attach启动方式
方式一:启动时候通过-XX:+StartAttachListener开启,通过Attach Listener触发。
方式二:如果不在启动jvm的时候启动Attach Listener线程,那只能依靠Signal Dispatcher线程来启动了。
Attach机制实现一个简单的Jstack
VirtualMachine attach = VirtualMachine.attach("pid");
InputStream in = ((HotSpotVirtualMachine) attach).remoteDataDump((Object[]) args);
byte b[] = new byte[256];
int n;
do {
n = in.read(b);
if (n > 0) {
System.out.println(new String(b, 0, n));
}
} while (n > 0);
in.close();