Arthas 之查看类加载信息的相关命令

通过 Arthas 中的 trace/monitor/watch/stack/tt 等命令,可以查看方法内部调用信息,从而定位定位方法调用问题。

sc(已加载的类信息)

方法介绍

“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息。

官方文档:

https://arthas.aliyun.com/doc/sc.html

参数说明

使用 sc --help 获取 sc 命令的帮助信息:

[arthas@32344]$ sc -help
 USAGE:
   sc [-c <value>] [-d] [-x <value>] [-f] [-h] [-E] class-pattern

 SUMMARY:
   Search all the classes loaded by JVM

 EXAMPLES:
   sc -d org.apache.commons.lang.StringUtils
   sc -d org/apache/commons/lang/StringUtils
   sc -d *StringUtils
   sc -d -f org.apache.commons.lang.StringUtils
   sc -E org\\.apache\\.commons\\.lang\\.StringUtils

 WIKI:
   https://alibaba.github.io/arthas/sc

 OPTIONS:
 -c, --classloader <value>               The hash code of the special class's classLoader
 -d, --details                           Display the details of class
 -x, --expand <value>                    Expand level of object (0 by default)
 -f, --field                             Display all the member variables
 -h, --help                              this help
 -E, --regex                             Enable regular expression to match (wildcard matching by default)
 <class-pattern>                         Class name pattern, use either '.' or '/' as separator

主要参数说明如下:

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。 如果一个类被多个 ClassLoader 所加载,则会出现多次
[E] 开启正则表达式匹配,默认为通配符匹配
[f] 输出当前类的成员变量信息(需要配合参数 - d 一起使用)
[x:] 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出
[c:] 指定 class 的 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[n:] 具有详细信息的匹配类的最大数量(默认为 100)

查看已加载的类信息

模糊搜索:

[arthas@32344]$ sc sample.*
sample.demo.ServerDemoApplication
sample.demo.ServerDemoApplication$$EnhancerBySpringCGLIB$$1a055512
sample.demo.controller.UserController
sample.demo.service.UserService
Affect(row-cnt:4) cost in 7 ms.

打印类的详细信息:

[arthas@32344]$ sc -d sample.demo.controller.UserController
 class-info        sample.demo.controller.UserController
 code-source       /C:/Codes/JavaWorkSpace/workspace48/arthas-demo/target/classes/
 name              sample.demo.controller.UserController
 isInterface       false
 isAnnotation      false
 isEnum            false
 isAnonymousClass  false
 isArray           false
 isLocalClass      false
 isMemberClass     false
 isPrimitive       false
 isSynthetic       false
 simple-name       UserController
 modifier          public
 annotation        org.springframework.scheduling.annotation.EnableScheduling,org.springframework.web.bind.annotation.
                   RestController
 interfaces
 super-class       +-java.lang.Object
 class-loader      +-sun.misc.Launcher$AppClassLoader@73d16e93
                     +-sun.misc.Launcher$ExtClassLoader@2752f6e2
 classLoaderHash   73d16e93

Affect(row-cnt:1) cost in 19 ms.

打印出类的 Field 信息:

[arthas@32344]$ sc -d -f sample.demo.controller.UserController
 class-info        sample.demo.controller.UserController
 code-source       /C:/Codes/JavaWorkSpace/workspace48/arthas-demo/target/classes/
 name              sample.demo.controller.UserController
 isInterface       false
 isAnnotation      false
 isEnum            false
 isAnonymousClass  false
 isArray           false
 isLocalClass      false
 isMemberClass     false
 isPrimitive       false
 isSynthetic       false
 simple-name       UserController
 modifier          public
 annotation        org.springframework.scheduling.annotation.EnableScheduling,org.springframework.web.bind.annotation.
                   RestController
 interfaces
 super-class       +-java.lang.Object
 class-loader      +-sun.misc.Launcher$AppClassLoader@73d16e93
                     +-sun.misc.Launcher$ExtClassLoader@2752f6e2
 classLoaderHash   73d16e93
 fields            name     log
                   type     org.slf4j.Logger
                   modifier final,private,static
                   value    Logger[sample.demo.controller.UserController]

                   name       userService
                   type       sample.demo.service.UserService
                   modifier   private
                   annotation org.springframework.beans.factory.annotation.Autowired


Affect(row-cnt:1) cost in 6 ms.

sm(已加载类的方法信息)

方法介绍

“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。

官方文档:

https://arthas.aliyun.com/doc/sm.html

参数说明

使用 sm --help 获取 thread 命令的帮助信息:

[arthas@32344]$ sm --help
 USAGE:
   sm [-c <value>] [-d] [-h] [-E] class-pattern [method-pattern]

 SUMMARY:
   Search the method of classes loaded by JVM

 EXAMPLES:
   sm java.lang.String
   sm -d org.apache.commons.lang.StringUtils
   sm -d org/apache/commons/lang/StringUtils
   sm *StringUtils *
   sm -Ed org\\.apache\\.commons\\.lang\.StringUtils .*

 WIKI:
   https://alibaba.github.io/arthas/sm

 OPTIONS:
 -c, --classloader <value>               The hash code of the special class's classLoader
 -d, --details                           Display the details of method
 -h, --help                              this help
 -E, --regex                             Enable regular expression to match (wildcard matching by default)
 <class-pattern>                         Class name pattern, use either '.' or '/' as separator
 <method-pattern>                        Method name pattern

主要参数说明如下:

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
[d] 展示每个方法的详细信息
[E] 开启正则表达式匹配,默认为通配符匹配
[c:] 指定 class 的 ClassLoader 的 hashcode
[classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
[n:] 具有详细信息的匹配类的最大数量(默认为 100)

查看方法信息

展示类的所有方法:

[arthas@32344]$ sm  sample.demo.controller.UserController
sample.demo.controller.UserController <init>()V
sample.demo.controller.UserController getUser(Ljava/lang/Integer;)Ljava/util/HashMap;
sample.demo.controller.UserController sample()V
Affect(row-cnt:3) cost in 33 ms.

展示方法的详细信息:

[arthas@32344]$ sm -d sample.demo.controller.UserController getUser
 declaring-class  sample.demo.controller.UserController
 method-name      getUser
 modifier         public
 annotation       org.springframework.web.bind.annotation.GetMapping
 parameters       java.lang.Integer
 return           java.util.HashMap
 exceptions       java.lang.Exception
 classLoaderHash  73d16e93

Affect(row-cnt:1) cost in 4 ms.