空心|记 Arthas 实现一次 CPU 排查与代码热更新( 三 )


即:jad 类全路径 方法名 > 存储路径/存储名称
然后到 tmp 路径下 vi 修改 java 文件即可 , 修改完成之后 , 查看对应的 classloader 为编译做准备 。
sc -d *OrderController | grep classLoaderHashmc -c 17f052a3 /tmp/OrderController.java -d /tmp
空心|记 Arthas 实现一次 CPU 排查与代码热更新但是这里编译出错了 , 官方提示:
空心|记 Arthas 实现一次 CPU 排查与代码热更新所以我们本地编译好 class 文件 , 上传上去是一样的 。
空心|记 Arthas 实现一次 CPU 排查与代码热更新编译前调用
[arthas@13190]$ trace com.arthas.controller.OrderController bigThreadPress Q or Ctrl+C to abort.Affect(class count: 1 , method count: 1) cost in 77 ms, listenerId: 2`---ts=2020-08-19 15:51:46;thread_name=http-nio-0.0.0.0-8080-exec-1;id=d;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6`---[6734.666529ms] com.arthas.controller.OrderController:bigThread() [throws Exception]+---[0.786517ms] com.arthas.service.ArthasService:test() #20`---throw:java.lang.OutOfMemoryError #-2 [unable to create new native thread]更新前代码
@RequestMapping(value = "http://kandian.youth.cn/bigThread")@ResponseBodypublic String bigThread(int id) {ArthasService.test();while (true) {Thread t2 = new Thread();t2.start();id ++;if(100000 == id) {return String.valueOf(id);}}}更新后代码
@RequestMapping(value = "http://kandian.youth.cn/bigThread")@ResponseBodypublic String bigThread(int id) {ArthasService.test();Thread t2 = new Thread();t2.start();return "success";}编译指令
[arthas@13190]$ redefine /tmp/OrderController.classredefine success, size: 1, classes:com.arthas.controller.OrderController编译后调用三次
`---ts=2020-08-19 15:52:02;thread_name=http-nio-0.0.0.0-8080-exec-3;id=f;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6`---[5.609405ms] com.arthas.controller.OrderController:bigThread()`---[0.204675ms] com.arthas.service.ArthasService:test() #20`---ts=2020-08-19 15:52:04;thread_name=http-nio-0.0.0.0-8080-exec-4;id=10;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6`---[3.900149ms] com.arthas.controller.OrderController:bigThread()`---[0.14636ms] com.arthas.service.ArthasService:test() #20`---ts=2020-08-19 15:52:04;thread_name=http-nio-0.0.0.0-8080-exec-5;id=11;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6`---[1.90945ms] com.arthas.controller.OrderController:bigThread()`---[0.147353ms] com.arthas.service.ArthasService:test() #20可以发现时间从 6734.666529ms 变成 3ms 左右 , 说明热更新的代码生效了 。