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