日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JVM插码之五:Java agent+ASM实战--监控所有方法执行时间

發布時間:2024/1/23 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM插码之五:Java agent+ASM实战--监控所有方法执行时间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文建立在對instrumentation和agent有初步的了解的前提下閱讀,關于這2個類的講解在其它文章中。

這是一個maven項目,pom中需要的配置,lib中有asm的jar包

pom.xml文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dxz</groupId><artifactId>chama</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>chama</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.ow2.asm</groupId><artifactId>asm-test</artifactId><version>6.2</version><scope>test</scope></dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm-analysis</artifactId><version>6.2</version></dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm-commons</artifactId><version>6.2</version></dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm-tree</artifactId><version>6.2</version></dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm-util</artifactId><version>6.2</version></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version></dependency><!-- https://mvnrepository.com/artifact/cglib/cglib --><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.2.5</version></dependency><!-- https://mvnrepository.com/artifact/oro/oro --><dependency><groupId>oro</groupId><artifactId>oro</artifactId><version>2.0.8</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>utf-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.0.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><manifestEntries><!-- <Premain-Class>com.dxz.chama.javaagent.patter.TimeMonitorPatterAgent</Premain-Class> --><!-- <Premain-Class>com.dxz.chama.javaagent.StatAgent</Premain-Class> --><Premain-Class>com.dxz.chama.javaagent.asm.UdAgent</Premain-Class></manifestEntries></transformer></transformers></configuration></execution></executions></plugin></plugins></build> </project>

打包后的agent的jar包中manifest屬性如下:

agent類,只有一個方法,就是把自定義的類修改器添加到instrumentation中。

package com.dxz.chama.javaagent.asm;import java.lang.instrument.Instrumentation;public class UdAgent {public static void premain(String agentArgs, Instrumentation instrumentation){instrumentation.addTransformer(new LogTransformer());} }

類轉換器實現:

package com.dxz.chama.javaagent.asm;import java.io.IOException; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.security.ProtectionDomain;import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter;public class LogTransformer implements ClassFileTransformer {@Overridepublic byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {try {ClassReader cr = new ClassReader(className);ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);TimeCountAdpter timeCountAdpter = new TimeCountAdpter(cw);cr.accept(timeCountAdpter, ClassReader.EXPAND_FRAMES);return cw.toByteArray();} catch (IOException e) {e.printStackTrace();}return null;} }

實際修改字節碼的方法,這里給每個類添加了一個字段UDASMCN,用于記錄當前類的名字(方便打印信息)。同時記錄每個方法的名字,以及執行時間。

package com.dxz.chama.javaagent.asm;import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.commons.AnalyzerAdapter; import org.objectweb.asm.commons.LocalVariablesSorter;public class TimeCountAdpter extends ClassVisitor implements Opcodes {private String owner;private boolean isInterface;private String filedName = "UDASMCN";private int acc = Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL;private boolean isPresent = false;private String methodName;public TimeCountAdpter(ClassVisitor classVisitor) {super(ASM6, classVisitor);}@Overridepublic void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {super.visit(version, access, name, signature, superName, interfaces);owner = name;isInterface = (access & ACC_INTERFACE) != 0;}@Overridepublic FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {if (name.equals(filedName)) {isPresent = true;}return super.visitField(access, name, descriptor, signature, value);}@Overridepublic MethodVisitor visitMethod(int access, String name, String descriptor, String signature,String[] exceptions) {MethodVisitor mv = cv.visitMethod(access, name, descriptor, signature, exceptions);if (!isInterface && mv != null && !name.equals("<init>") && !name.equals("<clinit>")) {methodName = name;AddTimerMethodAdapter at = new AddTimerMethodAdapter(mv);at.aa = new AnalyzerAdapter(owner, access, name, descriptor, at);at.lvs = new LocalVariablesSorter(access, descriptor, at.aa);return at.lvs;}return mv;}public void visitEnd() {if (!isInterface) {FieldVisitor fv = cv.visitField(acc, filedName, "Ljava/lang/String;", null, owner);if (fv != null) {fv.visitEnd();}}cv.visitEnd();}class AddTimerMethodAdapter extends MethodVisitor {private int time;private int maxStack;public LocalVariablesSorter lvs;public AnalyzerAdapter aa;public AddTimerMethodAdapter(MethodVisitor methodVisitor) {super(ASM6, methodVisitor);}@Overridepublic void visitCode() {mv.visitCode();mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false);time = lvs.newLocal(Type.LONG_TYPE);mv.visitVarInsn(LSTORE, time);maxStack = 4;}@Overridepublic void visitInsn(int opcode) {if (((opcode >= IRETURN && opcode <= RETURN) || opcode == ATHROW) && !isPresent) {mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false);mv.visitVarInsn(LLOAD, time);mv.visitInsn(LSUB);mv.visitVarInsn(LSTORE, time);mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");mv.visitTypeInsn(NEW, "java/lang/StringBuilder");mv.visitInsn(DUP);mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);mv.visitFieldInsn(GETSTATIC, owner, filedName, "Ljava/lang/String;");mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append","(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);mv.visitLdcInsn(" " + methodName + ":");mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append","(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);mv.visitVarInsn(LLOAD, time);mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(J)Ljava/lang/StringBuilder;",false);mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);maxStack = Math.max(aa.stack.size() + 4, maxStack);}mv.visitInsn(opcode);}@Overridepublic void visitMaxs(int maxStack, int maxLocals) {super.visitMaxs(Math.max(maxStack, this.maxStack), maxLocals);}}}

打包成jar包后,在另一個程序啟動時調用,啟動參數如下:

-javaagent:D:\study\chama\target\chama-0.0.1-SNAPSHOT.jar
執行效果:
時間單位是納秒,可以看到每個方法執行完時,都會打印這個方法 的執行時間,以com/Main main:11457636為例,說明類com/Main的main方法執行力11毫秒。

總結

以上是生活随笔為你收集整理的JVM插码之五:Java agent+ASM实战--监控所有方法执行时间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久综合激情网 | 精品久久久久一区 | 欧美精品导航 | 欧美特黄一级 | www.夜夜| 毛片啪啪啪 | 偷拍视频一区二区 | 香蕉成视频人app下载安装 | 都市激情自拍 | 男人的天堂在线视频 | 日韩精品一区在线观看 | 热99视频 | 免费中文字幕日韩欧美 | 成人久久精品 | 激情宗合网| 又粗又猛又爽又黄的视频 | 成人三级晚上看 | 天天爽天天爽夜夜爽毛片 | 亚洲aaaa级特黄毛片 | 亚洲成av人片在线观看无 | 香港三级日本三级三69 | 久久三 | 色wwwwww| 青青草成人在线 | jizz欧美性23| 国产视频一区二区在线播放 | 一炮成瘾1v1高h | 91精品国产色综合久久不卡粉嫩 | 桃色视频 | 国产精品自拍亚洲 | 国产中文字幕在线播放 | 狠狠干天天 | 国产成人免费在线观看 | 中文字幕自拍偷拍 | 炕上如狼似虎的呻吟声 | 国产精品成人自拍 | 神马午夜一区 | 欧美一级鲁丝片 | 久久精选| 国产女女| 欧美一a一片一级一片 | 国产精品永久免费观看 | 国产一区二区三区色淫影院 | 中文字幕在线日韩 | japanese在线 | 91视频论坛 | 永久久久久久 | 成人免费大片黄在线播放 | 我的丝袜美腿尤物麻麻 | 久久久久久免费精品 | 亚洲污视频 | 国产亚洲综合精品 | 伊人日本 | 一本久久精品一区二区 | 久久视精品| 亚洲欧美中文字幕5发布 | 日韩在线不卡 | 精品视频在线观看 | 中文字幕中文在线 | 国产精品国产成人国产三级 | 日韩精品视频三区 | 亚洲中午字幕 | 国产午夜一级一片免费播放 | 日本精品视频在线播放 | 狠狠操中文字幕 | 一区二区三区四区精品 | 亚洲AV午夜精品 | 中文字幕日韩在线观看 | 日日操网站 | 78m78成人免费网站 | 日本熟妇一区二区三区 | 深夜在线视频 | 合欢视频污| 无码国产精品一区二区免费16 | 亚欧成人精品一区二区 | 欧美少妇xxx| 男生操女生逼逼 | 欧美 亚洲 视频 | 性色欲情网站iwww九文堂 | 毛片基地免费观看 | 亚洲国产一区在线观看 | 日韩r级电影在线观看 | 黄色欧美在线 | 秋霞福利视频 | 澳门超碰 | 舐丝袜脚视频丨vk | 天天摸天天做天天爽水多 | 91精品欧美一区二区三区 | 97视频久久久 | 2级黄色片 | 欧美日韩中文字幕 | 黄色a级片在线观看 | 国产精品一区二区三区在线播放 | 一本到视频 | 国产高清在线免费观看 | 国产女人被狂躁到高潮小说 | 国产精品永久在线观看 | 免费黄色一级 | 男插女动态图 |