目录

vmtool

提示

@since 3.5.1

vmtool在线教程在新窗口打开

vmtool 利用JVMTI接口,实现查询内存对象,强制 GC 等功能。

获取对象

$ vmtool --action getInstances --className java.lang.String --limit 10
@String[][
    @String[com/taobao/arthas/core/shell/session/Session],
    @String[com.taobao.arthas.core.shell.session.Session],
    @String[com/taobao/arthas/core/shell/session/Session],
    @String[com/taobao/arthas/core/shell/session/Session],
    @String[com/taobao/arthas/core/shell/session/Session.class],
    @String[com/taobao/arthas/core/shell/session/Session.class],
    @String[com/taobao/arthas/core/shell/session/Session.class],
    @String[com/],
    @String[java/util/concurrent/ConcurrentHashMap$ValueIterator],
    @String[java/util/concurrent/locks/LockSupport],
]

提示

通过 --limit参数,可以限制返回值数量,避免获取超大数据时对 JVM 造成压力。默认值是 10。

指定 classloader name

vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.springframework.context.ApplicationContext

指定 classloader hash

可以通过sc命令查找到加载 class 的 classloader。

$ sc -d org.springframework.context.ApplicationContext
 class-info        org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
 code-source       file:/private/tmp/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-1.5.13.RELEASE.jar!/
 name              org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
...
 class-loader      +-org.springframework.boot.loader.LaunchedURLClassLoader@19469ea2
                     +-sun.misc.Launcher$AppClassLoader@75b84c92
                       +-sun.misc.Launcher$ExtClassLoader@4f023edb
 classLoaderHash   19469ea2

然后用-c/--classloader 参数指定:

vmtool --action getInstances -c 19469ea2 --className org.springframework.context.ApplicationContext

指定返回结果展开层数

提示

getInstances action 返回结果绑定到instances变量上,它是数组。

通过 -x/--expand 参数可以指定结果的展开层次,默认值是 1。

vmtool --action getInstances -c 19469ea2 --className org.springframework.context.ApplicationContext -x 2

执行表达式

提示

getInstances action 返回结果绑定到instances变量上,它是数组。可以通过--express参数执行指定的表达式。

vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.springframework.context.ApplicationContext --express 'instances[0].getBeanDefinitionNames()'

强制 GC

vmtool --action forceGc
  • 可以结合 vmoption 命令动态打开PrintGC开关。

interrupt 指定线程

thread id 通过-t参数指定,可以使用 thread命令获取。

vmtool --action interruptThread -t 1