jvm外挂工具揭秘
所属分类 java
浏览量 1902
Agent c 和 Java
Attach SA 和 VirtualMachine
JMX和PerfData
Native Agent
C/C++ 实现的 Agent,使用 JVMTI(JVM Tool Interface)接口与JVM进行通讯,
订阅感兴趣的JVM事件(比如方法出入、线程始末等),当这些事件发生时,回调Agent代码。
相关Profile工具,如Yourkit,JProfiler,aysnc-profiler,JRebel
JRebel 动态Reload Class不重启应用
jvm启动命令里加入 -agentlib: 或 -agentpath: /path/to/agent.so
也可以使用 VituralMachine.attach() 动态加载
Java Agent
底层也是基于 JVMTI
AOP 代码植入 在加载class文件之前做拦截并对字节码做修改。
比如 AspectJ,单元测试覆盖率 Jacoco,动态重载Class的Spring-Loaded
JMXAgent 启动一个线程 监听 响应 JMX 请求
jolokia 启动线程,监听响应 Restful JMX请求
btrace 接收client 脚本字节码,进行加载并输出结果。
两种启动方式
启动命令行加入 -javaagent:/path/to/agent.jar,
根据agent.jar中的MANIFEST.MF文件中的Premain-Class定义,JVM找到相应的MyAgent类,调用其premain函数。
使用 VM.attach() 由外部程序灵活加载,调用其agentmain函数。
Vitural Machine.attach()
通过Unix Domain Socket 与目标JVM的Attach Listener线程进行交互。
Socket 文件为/tmp/.java_pid$PID。
com.sun.tools.attach.VirtualMachine 及其子类 sun.tools.attach.HotSpotVirtualMachine
在tools.jar中
jmap jcmd 默认使用该机制
SA.attach()
Serviceability Agent
分析JVM运行时 Snapshot数据 , 通过系统调用ptrace实现
ptrace会使内核暂停目标进程并将控制权交给跟踪程序,跟踪程序可以察看目标进程的内存
sun.jvm.hotspot.HotSpotAgent 负责 attach
sun.jvm.hotspot.runtime.VM 负责具体操作
VM类 提取JVM内部数据结构
内存 getObjectHeap()/getUniverse()
线程 getThreads()
永久代内容的 getSymbolTable(),getStringTable(), getSystemDictionary()
jstack,jmap 默认使用 VM.attach()模式,与目标JVM的Attach Listener 通信,
无法响应时 可以使用 -F 参数, 使用SA.attach 模式,用 ptrace 暴力接管进程, 详细代码见 sun.tools.jmap.JMap
PerfData
JVM 统计数据 定期写入到 /tmp/hsperfdata_$username/$pid 文件中
jcmd $PID PerfCounter.print
jps 读取 /tmp/hsperfdata_$username/ 目录下所有的文件
jstat 也使用该文件
JMX需要与应用交互,会干扰应用程序运行
perfdata 和 vm.attach 需要读写 /tmp 目录
JVM启动参数修改临时目录
java agent 简单例子
arthas使用
JMX之Jolokia使用
上一篇
下一篇
innodb mvcc
go http server
实用金融常识
git查看某个文件的变更记录
eclipse关闭验证
约瑟夫环java实现