萱草|又一款Java调试神器( 四 )

7、monitor 命令
监控类、方法的调用进行监控 , 调用次数、成功次数、失败次数、平均响应时长、失败率等 。
$ classloader #每种classloader加载类的个树 namenumberOfInstancesloadedCountTotalorg.springframework.boot.loader.LaunchedURLClassLoader14463com.taobao.arthas.agent.ArthasClassloader23631BootstrapClassLoader12961java.net.FactoryURLClassLoader1835sun.misc.Launcher$AppClassLoader146sun.reflect.DelegatingClassLoader4141sun.misc.Launcher$ExtClassLoader125Affect(row-cnt:7) cost in 7 ms.$ classloader -t# 类加载器间的层级关系+-BootstrapClassLoader+-sun.misc.Launcher$ExtClassLoader@1959f618+-com.taobao.arthas.agent.ArthasClassloader@5fc476c6+-com.taobao.arthas.agent.ArthasClassloader@5017e14b+-sun.misc.Launcher$AppClassLoader@5c647e05+-java.net.FactoryURLClassLoader@4ad317f0+-org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418Affect(row-cnt:7) cost in 5 ms8、classloader 命令
将JVM中所有的类加载器统计出来 , 树状展示
$ classloader #每种classloader加载类的个树 namenumberOfInstancesloadedCountTotalorg.springframework.boot.loader.LaunchedURLClassLoader14463com.taobao.arthas.agent.ArthasClassloader23631BootstrapClassLoader12961java.net.FactoryURLClassLoader1835sun.misc.Launcher$AppClassLoader146sun.reflect.DelegatingClassLoader4141sun.misc.Launcher$ExtClassLoader125Affect(row-cnt:7) cost in 7 ms.$ classloader -t# 类加载器间的层级关系+-BootstrapClassLoader+-sun.misc.Launcher$ExtClassLoader@1959f618+-com.taobao.arthas.agent.ArthasClassloader@5fc476c6+-com.taobao.arthas.agent.ArthasClassloader@5017e14b+-sun.misc.Launcher$AppClassLoader@5c647e05+-java.net.FactoryURLClassLoader@4ad317f0+-org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418Affect(row-cnt:7) cost in 5 ms# 实战案例
我在网上看到一个动态修改上线项目的案例 , 我觉得比较有意思 , 这里整理一下给大家分享一下 。
这个案例主要做了一件事情 , 在不停机不重启不重新发包的情况下 , 手动在代码中去掉抛异常代码 , 具体要修改的代码如下:
萱草|又一款Java调试神器启动服务也达到我们预期异常
萱草|又一款Java调试神器具体替换代码的流程如下:
1、jad:将需要更改的文件先进行反编译 , 保存下来, 编译器修改
$ jad --source--only com.example.demo.DemoApplication > /data/DemoApplication.java2、SC:查找当前类是哪个classLoader加载的
$ sc -d *DemoApplication | grep classLoaderclassLoaderHash20ad9418 #类加载器编号3、MC:用指定的classloader重新将类在内存中编译
$ mc -c 20ad9418 /data/DemoApplication.java -d /data Memory compiler output:/data/com/example/demo/DemoApplication.class4、redefine:将编译后的类加载到JVM , 上边编译后的.class文件地址
$ redefine /data/com/example/demo/DemoApplication.classredefine success, size: 1文件替换后我们再次访问一下程序 , 发现异常没有了程序已经是我们修改正确后的 , class文件替换成功


推荐阅读