java.lang.Instrumentation作用,虚拟机监控
来源:互联网 发布:东莞金域名苑 编辑:程序博客网 时间:2024/06/01 09:08
Instrumentation是Java5提供的新特性。使用Instrumentation,开发者可以构建一个代理,用来监测运行在JVM上的程序。监测一般是通过在执行某个类文件之前,对该类文件的字节码进行适当的修改进行的。
java.lang.instrument中需要关注的是ClassFileTransformer和Instrumentation接口。每个代理类必须实现 ClassFileTransformer接口,这个接口提供了一个transform方法:
- byte[] transform(ClassLoader loader,
- String className,
- Class<?> classBeingRedefined,
- ProtectionDomain protectionDomain,
- byte[] classfileBuffer)
- throws IllegalClassFormatException
byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException
通过这个方法,代理可以得到虚拟机载入的类的字节码,并可对其进行修改,完成字节码级的修改。各个参数的含义为:
loader:将被转换的类的类装载器,如果是启动类装载器则此参数可以为空;
className:类名字,不过这是JVM规范定义的全限名字如java/util/List
protectionDomain:保护域,跟安全有关;
classFileBuffer:这个便是被代理类字节码流,正是通过操作这个buffer完成对字节码的修改;
对于函数的返回值,如果返回null,则表示不对类的字节码做任何的修改,否则应该返回修改过的byte[]对象。
除了实现ClassFileTransformer接口外,我们还需要提供一个公共的静态方法:
public static void premain(String agentArgs, Instrumentation inst)
一般会在这个方法中创建一个代理对象,通过Instrumentation对象的addTransformer()方法,将创建的代理对象再传递给虚拟机。
一个简单的演示实例:
agent类实现:
- public class HelloWorldimplements ClassFileTransformer {
- @Override
- public byte[] transform(ClassLoader loader, String className,
- Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
- byte[] classfileBuffer) throws IllegalClassFormatException {
- System.out.println("java.lang.instrument, hello world!");
- return null;
- }
- public staticvoid premain(String args,Instrumentation inst){
- inst.addTransformer(new HelloWorld());
- }
- }
public class HelloWorld implements ClassFileTransformer {@Overridepublic byte[] transform(ClassLoader loader, String className,Class<?> classBeingRedefined, ProtectionDomain protectionDomain,byte[] classfileBuffer) throws IllegalClassFormatException {System.out.println("java.lang.instrument, hello world!");return null;}public static void premain(String args,Instrumentation inst){inst.addTransformer(new HelloWorld());}}
监控类:
- public class Example {
- public staticvoid main(String[] args){
- System.out.println("main class of proxy!");
- }
- }
public class Example {public static void main(String[] args){System.out.println("main class of proxy!");}}
将agent类HelloWorld编译成可运行的jar(helloworld.jar),这里注意在manifest文件中添加premain入口,也即其配置为:
- Manifest-Version: 1.0
- Premain-Class: cn.dstrace.instrument.HelloWorld
Manifest-Version: 1.0Premain-Class: cn.dstrace.instrument.HelloWorld完成这些步骤以后,通过java -javaagent:helloworld.jar cn.dstrace.instrument.Example运行,则可看到结果:
这里只是简单的演示了java.lang.instrument是怎么作用到被代理类的,后面讲通过字节码操作工具asm来实现一个具体的应用实例,到时候估计就明白了其强大之处,其实在java的各种性能监控工具中都有instrument的身影,如jconsole等
- java.lang.Instrumentation作用,虚拟机监控
- Java.lang.ClassNotFound Instrumentation 测试异常
- Instrumentation run failed due to 'java.lang.IllegalAccessError'
- Robotium Instrumentation run failed due to 'java.lang.ClassNotFoundException'
- java.lang.NoClassDefFoundError: io.bugtags.agent.instrumentation.HttpInstrumentation
- java.lang.NoClassDefFoundError: com.networkbench.agent.impl.instrumentation.NBSGsonInstrumentation
- Java虚拟机内存监控
- java虚拟机监控
- java虚拟机性能监控
- Instrumentation.java
- [Java]Instrumentation
- Java Instrumentation
- JAVA Instrumentation
- Java虚拟机监控指标及监控配置
- java远程调试、监控虚拟机
- java远程调试、监控虚拟机
- java虚拟机监控jconsole学习
- jvisualvm远程监控java虚拟机
- C++ Qt 11:文本编辑器——拖放技术
- float高度不一致 导致错位的解决办法
- JS复选框操作
- 15项最佳电子产品影响人类未来
- Parallel.ForEach平行线程中的实体的值在输出或打印时二次赋值是可能会串
- java.lang.Instrumentation作用,虚拟机监控
- JQuery Mobile实现动态下拉框代码
- rman 同机复制数据库
- python的 Digango框架的安装
- FFplay 整体流程图
- mysql dump binlog master状态
- rman 异机复制数据库
- 开关电源基本知识
- Android repo 切换分支