什么是APM
APM 是Application perfmance monitor的简称, 应用性能监控。在移动互联网对人们生活影响越来越大的今天,App的功能越来越全面,从吃穿住行,到支付开房,全方面覆盖。相同功能的App存在很多竞品,比如携程和艺龙,天猫和京东,网易云音乐和QQ音乐。随之而来的就是App性能的要求越来越高,不能被动的等待用户异常的发生然后根据线上日志去修复bug,再发补丁版本。主动监控App性能,变得越来越重要,分析App的耗电,UI卡顿,网络性能(Socket连接时间,首字节接受时间等等)成为了当物之急。但是如何能在不更改业务方代码的同时完成一个移动端的监控呢?AOP成为了我们一个很好的选择,我们首先了解一些基本概念。
一些基本概念
- JavaAgent
代理 (agent) 是在你的main方法前的一个拦截器 (interceptor),也就是在main方法执行之前,执行agent的代码。
主要作用
可以在加载class文件之前做拦截,对字节码做修改
agent的代码与你的main方法在同一个JVM中运行,并被同一个system classloader装载,被同一的安全策略 (security policy) 和上下文 (context) 所管理。
用法
public class MyAgent {
public static void agentmain(String args, Instrumentation instrumentation){
permain(args, instrumentation);
}
public static void permain(String args, Instrumentation instrumentation){
instrumentation.addTransformer(new MainTransformer());
}
}
如果javaagent是在虚拟机启动之后加载的,我们需要在它的manifest文件中指定Agent-Class属性,它的值是javaagent的实现类,这个实现类需要实现一个agentmain方法
public static void agentmain(String args, Instrumentation instrumentation){
permain(args, instrumentation);
}
但是如果javaagent是在JVM启动时通过命令行参数加载的,情况会不太一样,需要在它的manifest文件中指定Premain-Class属性,它的值是javaagent的实现类,这个实现类需要实现一个premain方法。
public static void permain(String args, Instrumentation instrumentation){
instrumentation.addTransformer(new MainTransformer());
}
- Instrumentation
从Agent的两个方法可以看到都会传入2个参数,一个是参数agrs,另一个就是Instrumentation。那Instrumentation是什么呢
来看一段官方的解释
java.lang.instrument
public interface Instrumentation
This class provides services needed to instrument Java programming langua