开始准备使用javaAgent制作一个开源工具


在当前公司的日常开发里,存在一个非常棘手的问题,主要问题如下:

1.项目是一个大型单体应用,主要是一个tomcat程序。

2.由多部门联合开发,我的任务主要是基于别人的jar包,进行二次开发。而且其他的所有jar包都不给源码包,只能反编译jar包查看。

3.大家都在一个spring容器里,各种jar包放在一起,跑在一个tomcat上。

4.启动特别慢,性能强劲的电脑,也要5-10分钟才能启动。运行性能也很差,目测观察还存在内存泄漏。

5.经过反编译观察,至少存在如下代码问题:componentScan随便扫package;还有classScanner去扫描各种class文件;随意的AOP切面编写;资源申请和回收非常随意。等等问题。

6.没有任何有效监控手段,因为这个大型单体应用是监控别人的。自己反而没有自监控手段。

我尝试加入了慢SQL打印、使用prometheus检查JMX、使用arthas和profile进行了性能瓶颈的定位,发现了一些问题。但是实际操作上并不简单。

总结下来:

1.没有一个可用的成熟的监控系统,这种监控系统的搭建一般依赖大数据组建,在个人工作电脑上捉襟见肘。

2.完全是黑盒的代码,各部门的代码,都不提供源码包,不方便观察分析。

3.依赖较强的排查经验,需要有敏感度和知识功底。

我突然想到,可能有其他人跟我有一样的问题,并不是每个人都用上了微服务,也不是每个人都有资源去搭建各种监控系统。

如何在面对这一坨屎山一样的、黑盒的、大型单体工程里,迅速找到一些直接的性能优化点呢?

我觉得,可以通过javaAgent的方式,把我的 知识经验做成插件,第三方也可以开发插件,在应用启动的时候,使用我们的agent进行增强;

主要进行如下检测:

1.class scan的插桩,并统计扫描耗时,方便找到罪魁祸首的jar包。

2.spring的bean的 生命周期耗时,尤其是 init,postConstruct之类的,有人喜欢在里面做各种业务操作,启动非常耗时。

3.AOP增强的类和切面的统计,看看到底是谁在乱写通配符,到底在无意间增强了多少类。

4.对jedis、jsch、httpclient、mysql jdbc的资源进行插桩,看看创建了连接,但是却一直不释放。

5.对指定的正则模式进行增强,统计其请求耗时,制作一个穷人版的简易监控系统。可以让函数调用的统计不依赖大型监控系统,可以简单地自定义,并统计出来。

6.jdbc的插桩,统计数据库操作耗时。

7.mybatis的插桩,找到不合理的滥用和mapper的耗时。

8.其他的一些缺陷检测。

简而言之,就是 把排查问题的经验智慧,浓缩成一个个插件,让agent帮我们做动态的分析。

开源项目的启动里程碑,写于公司。