agent探针
时间: 2025-07-30 21:04:41 浏览: 9
### 功能
Java Agent探针是一种可以在JVM启动时或运行时动态修改类字节码的技术。它主要用于监控、性能分析、日志记录、安全检查等场景。通过Java Agent,开发者可以无需修改应用程序代码即可实现对方法执行时间的监控、内存使用情况的分析等功能。
### 使用方法
Java Agent的使用主要分为两个步骤:编写Agent类并实现`premain`或`agentmain`方法,以及创建包含`Premain-Class`或`Agent-Class`属性的`MANIFEST.MF`文件。下面是一个简单的例子,展示如何创建一个用于监控方法执行时间的Java Agent:
#### 创建Agent类
```java
public class MethodMonitorAgent {
public static void premain(String args, Instrumentation inst) {
inst.addTransformer((l, className, classBeingRedefined, protectionDomain, classfileBuffer) -> {
if (className.equals("com/example/MyClass")) {
ClassReader reader = new ClassReader(classfileBuffer);
ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES);
ClassVisitor visitor = new ClassVisitor(ASM9, writer) {
@Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String attributes, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, descriptor, attributes, exceptions);
return new MethodVisitor(ASM9, mv) {
@Override
public void visitCode() {
mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false);
mv.visitVarInsn(LSTORE, 1);
super.visitCode();
}
@Override
public void visitInsn(int opcode) {
if (opcode >= IRETURN && opcode <= RETURN) {
mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false);
mv.visitVarInsn(LLOAD, 1);
mv.visitInsn(LSUB);
mv.visitMethodInsn(INVOKESTATIC, "com/example/MethodMonitor", "recordTime", "(J)V", false);
}
super.visitInsn(opcode);
}
};
}
};
reader.accept(visitor, ClassReader.EXPAND_FRAMES);
return writer.toByteArray();
}
return null;
});
}
}
```
#### 创建MANIFEST.MF文件
```
Manifest-Version: 1.0
Premain-Class: MethodMonitorAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
```
#### 运行Java Agent
在运行应用程序时,通过`-javaagent`参数指定Agent jar包的位置:
```
java -javaagent:method-monitor-agent.jar -jar myapp.jar
```
### 监控
通过Java Agent技术,可以轻松实现对方法执行时间的监控。例如,在上述示例中,每当`com/example/MyClass`中的方法执行完毕时,都会调用`MethodMonitor.recordTime(long time)`方法记录方法执行时间。这种方法不需要修改应用程序源代码,只需要在启动时添加一个`-javaagent`参数即可实现对方法执行时间的监控。
此外,Java Agent还可以与其他工具结合使用,如JRebel、Spring Boot的热部署插件、BTrace、Greys以及阿里开源的Arthas等工具,这些工具都利用了Java Agent技术来实现热部署、线上诊断等功能。
阅读全文
相关推荐


















