千寻位置 开发demo_java程序开发,使用javaagent无侵入代码方式,监控方法执行耗时...
生活随笔
收集整理的這篇文章主要介紹了
千寻位置 开发demo_java程序开发,使用javaagent无侵入代码方式,监控方法执行耗时...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景描述
javaagent是在JDK5之后提供的新特性,也可以叫java代理。開發者通過這種機制(Instrumentation)可以在加載class文件之前修改方法的字節碼(此時字節碼尚未加入JVM),動態更改類方法實現AOP,提供監控服務如;方法調用時長、可用率、內存等。
開發簡述
通過實現ClassFileTransformer接口方法,動態更改方法的字節碼。在方法前后加上時間戳,最后執行完成輸出執行時長。
環境準備
1、IntelliJ IDEA Community Edition 2018.3.1 x64
2、jdk1.8 64位
配置信息(路徑相關修改為自己的)
1、java調試時配置
2.1、配置位置:Run/Debug Configurations ->VM options
2.2、配置內容(編譯后的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() { //對指定方法監控 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("/總結
以上是生活随笔為你收集整理的千寻位置 开发demo_java程序开发,使用javaagent无侵入代码方式,监控方法执行耗时...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一加到1亿。C语言_可能是今年最难选的2
- 下一篇: rocket mq 监听端口_浅谈业务流