首页   快速返回

jvm外挂工具揭秘     所属分类 java 浏览量 6
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启动参数修改临时目录

上一篇     下一篇
innodb mvcc

go http server

实用金融常识

git查看某个文件的变更记录

eclipse关闭验证

约瑟夫环java实现