主要观点总结
文章介绍了Arthas,一个由阿里巴巴开源的Java诊断工具,用于动态跟踪Java代码、实时监控JVM状态。文中还介绍了Arthas的一些基本用法,如stack、jad、sc、watch、trace、jobs、logger、dashboard和redefine等命令,以及这些命令的用途和参数说明。同时,文章还提到了一些高级功能,并建议读者加入知识星球以获取更多帮助。
关键观点总结
关键观点1: Arthas介绍
Arthas是一个由阿里巴巴开源的Java诊断工具,用于动态跟踪Java代码、实时监控JVM状态。
关键观点2: Arthas基本用法
文中介绍了Arthas的一些基本用法,包括stack、jad、sc、watch、trace、jobs、logger、dashboard和redefine等命令,以及这些命令的用途和参数说明。
关键观点3: 高级功能
文中提到了一些Arthas的高级功能,如热更新类和查看当前系统的实时数据面板等。
关键观点4: 加入知识星球
文章鼓励读者加入知识星球,以获取更多关于项目实战、面试招聘、源码解析和学习路线等方面的帮助。
正文
class-pattern
method-pattern
[arthas@79952]$ stack com.baomidou.mybatisplus.extension.service.IService getOne
Press Q or Ctrl+C to abort.
Affect(class-cnt:202 , method-cnt:209) cost in 10761 ms.
ts=2019-11-13 11:49:13;thread_name=http-nio-8801-exec-6;id=2d;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@a6c54c3
@com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.getOne()
at com.baomidou.mybatisplus.extension.service.IService.getOne(IService.java:230)
...... ......
at cn.test.mobile.controller.order.OrderController.getOrderInfo(OrderController.java:500)
可以看到OrderController.java的第500行调用了这个getOne接口。
注意这个命令需要调用后才会触发日志,相似的还有watch、trace等
反编译指定已加载类的源码
有时候,版本发布后,代码竟然没有执行,代码是最新的吗,这时可以使用jad反编译相应的class。
jad cn.test.mobile.controller.order.OrderController
仅编译指定的方法
jad cn.test.mobile.controller.order.OrderController getOrderInfo
ClassLoader:
@RequestMapping(value={"getOrderInfo"}, method={RequestMethod.POST})
public Object getOrderInfo(HttpServletRequest request, @RequestBody Map map) {
ResponseVo responseVo = new ResponseVo();
... ... ... ...
“Search-Class” 的简写 ,查看JVM已加载的类信息 有的时候,你只记得类的部分关键词,你可以用sc获取完整名称 当你碰到这个错的时候“ClassNotFoundException”或者“ClassDefNotFoundException”,你可以用这个命令验证下
|
|
class-pattern
|
|
method-pattern
|
|
|
输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。如果一个类被多个ClassLoader所加载,则会出现多次
|
模糊搜索
sc *OrderController*
cn.test.mobile.controller.order.OrderController
打印类的详细信息 sc -d
sc -d cn.test.mobile.controller.order.OrderController
class-info cn.test.mobile.controller.order.OrderController
code-source /F:/IDEA-WORKSPACE-TEST-qyb/trunk/BE/mobile/target/classes/
name cn.test.mobile.controller.order.OrderController
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name OrderController
modifier public
annotation org.springframework.web.bind.annotation.RestController,org.springframework.web.bind.annotation.Requ
estMapping
interfaces
super-class +-cn.test.mobile.controller.BaseController
+-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@18b4aac2
+-sun.misc.Launcher$ExtClassLoader@480bdb19
classLoaderHash 18b4aac2
查看String里的方法
sm java.lang.String
java.lang.String ([BII)V
java.lang.String ([BLjava/nio/charset/Charset;)V
java.lang.String ([BLjava/lang/String;)V
java.lang.String ([BIILjava/nio/charset/Charset;)V
java.lang.String ([BIILjava/lang/String;)V
... ... ... ...
查看String中toString的详细信息
sm -d java.lang.String toString
declaring-class java.lang.String
method-name toString
modifier public
annotation
parameters
return java.lang.String
exceptions
classLoaderHash null
可以监测一个方法的入参和返回值
有些问题线上会出现,本地重现不了,这时这个命令就有用了