文章字数:309,阅读全文大约需要1分钟
Java Attach
是一种让java
进程之间进行通信的机制。比如jvm
运行时获取信息的jstack
工具就是应用Attach
的。
作用
获取信息
: 通过Attach机制可以获取jvm的内存dump、线程dump、类统计信息、获取vm flag、获取系统属性等。动态控制程序
: 为jvm进程动态加载agent,动态设置vm flag(运行时的flag)
简单使用
- 使用
com.sun.tools.attach
下的相关类
1 | public static void main(String[] args) throws IOException, AttachNotSupportedException { |
- 相关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
线程会监听这个文件,有信息就解析,执行,返回。