千寻位置 开发demo_java程序开发,使用javaagent无侵入代码方式,监控方法执行耗时...
背景描述
javaagent是在JDK5之后提供的新特性,也可以叫java代理。開發(fā)者通過這種機制(Instrumentation)可以在加載class文件之前修改方法的字節(jié)碼(此時字節(jié)碼尚未加入JVM),動態(tài)更改類方法實現(xiàn)AOP,提供監(jiān)控服務如;方法調(diào)用時長、可用率、內(nèi)存等。
開發(fā)簡述
通過實現(xiàn)ClassFileTransformer接口方法,動態(tài)更改方法的字節(jié)碼。在方法前后加上時間戳,最后執(zhí)行完成輸出執(zhí)行時長。
環(huán)境準備
1、IntelliJ IDEA Community Edition 2018.3.1 x64
2、jdk1.8 64位
配置信息(路徑相關修改為自己的)
1、java調(diào)試時配置
2.1、配置位置:Run/Debug Configurations ->VM options
2.2、配置內(nèi)容(編譯后的jar放到根目錄下):-javaagent:E:itstack-demo-javaagent-1.0-SNAPSHOT.jar=agentargs
代碼示例
pom.xml
org.javassist javassist 3.22.0-GAMyAgent.java
MyTransformer.java
public class MyTransformer implements ClassFileTransformer { private final static String prefix = "long startTime = System.currentTimeMillis();"; private final static String postfix = "long endTime = System.currentTimeMillis();"; // 被處理的方法列表 private final static Map> methodMap = new HashMap>(); public MyTransformer() { //對指定方法監(jiān)控 add("org.itstack.demo.test.AgentTest.queryUserAge"); add("org.itstack.demo.test.AgentTest.queryUserName"); } private void add(String methodString) { String className = methodString.substring(0, methodString.lastIndexOf(".")); String methodName = methodString.substring(methodString.lastIndexOf(".") + 1); List list = methodMap.get(className); if (list == null) { list = new ArrayList(); methodMap.put(className, list); } list.add(methodName); } @Override public byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { className = className.replace("/總結(jié)
以上是生活随笔為你收集整理的千寻位置 开发demo_java程序开发,使用javaagent无侵入代码方式,监控方法执行耗时...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一加到1亿。C语言_可能是今年最难选的2
- 下一篇: antix linux安装教程,anti