java-agent
简介
什么是java-agent、作用是什么、怎么用、原理是什么?java-agent可以理解为是一个代理程序,非主程序,代理程序可以做的事情就很多了,取决于你想写什么逻辑比如说Alibaba开源的Java诊断工具也可以动态的替换字节码,实现代码热更新的效果
原理通过java-agent程序我们可以获取到Instrumentation实例,得到此实例之后可以干的事情就很多了,比如说aop字节码增强,或者重新定义class等
具体原理可参考1:美团的技术分享-agent原理2:美团的技术分享-字节码增强原理
agent程序可以在主程序启动之前启动,做你想做的操作,需要编写逻辑代码并封装成Jar包,并在jvm 启动命令添加 -[javaagent|agentlib]:agentJar包的路径,jdk1.5之后才可以jar包中的class方法signature必须为 public static void premain(String agentArgs, Instrumentation inst)
也可以在主程序运行过程中启动,通过jdk自带的方法VirtualMachi ...
踩坑发现bug之解决springRemoteRestart不起作用
springDevTools提供了热部署的工具,按照网上的教程本地可以完美的支持热部署,但是一用到远程热部署(remoteRestart)就失效,热部署失败,抛ClassCastException异常为了解决这个问题,咱们今天分析一下他的原理,为什么本地可以热部署,远程热部署就会抛异常
技术栈:springBoot + MVC + DUBBO + NACOS + maven打包插件spring-boot-maven-plugin
热部署原理分析当我们修改class时,springDevTools利用了不同的classLoader重新加载class,并重新启动spring,使其生效优点就是已经加载过的class并不会重新加载以便节省性能,只针对动态修改的class重新加载即可
已加载的class无法在线卸载,只能用新的classLoader去加载,这样就起到了热部署的效果旧的classLoader以及对应加载过的class会被GC回收
在springBoot启动的时候,监听启动时的事件,然后用自己的热部署classLoader去重新启动spring(通过反射再次 ...