JDK.attach 包解析
和JVM通信,发送指令请求
一、描述
从JDK6
开始引入,除了Solaris平台的Sun JVM支持远程的Attach,在其他平台都只允许Attach到本地的JVM上。
用Java语言编写的工具使用此API附加到目标虚拟机(VM),并将其tool agent 加载到目标VM中。
什么是attach机制?
说简单点就是jvm提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程,并让它执行内部的一些操作,比如说我们为了让另外一个jvm进程把线程dump出来,那么我们跑了一个jstack的进程,然后传了个pid的参数,告诉它要哪个进程进行线程dump,既然是两个进程,那肯定涉及到进程间通信,以及传输协议的定义,比如要执行什么操作,传了什么参数等
涉及进程间通信。启动Attach Listener
进程和VM进程通信。交换数据的方式使用的是SOCKET
。
约束
除了 Attach API
规定的API
功能。还依赖针对JVM
的具体实现,如果jvm
嗯实现不支持,api也没有用。
功能
- 内存dump
- 线程dump
- 类信息统计(比如加载的类及大小以及实例个数等)
- 动态加载agent
- 动态设置vm flag(但是并不是所有的flag都可以设置的,因为有些flag是在jvm启动过程中使用的,是一次性的)
- 打印vm flag
- 获取系统属性等
二、实现原理
能够说明ATTCH的作用,也提供更高阶,更细致的分析。
说简单点就是jvm
提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程,并让它执行内部的一些操作,比如说我们为了让另外一个jvm
进程把线程dump
出来,那么我们跑了一个jstack
的进程,然后传了个pid
的参数,告诉它要哪个进程进行线程dump
&#