Back to Arthas

vmtool

site/docs/en/doc/vmtool.md

3.1.04.9 KB
Original Source

vmtool

::: tip @since 3.5.1 :::

vmtool online tutorial

vmtool uses the JVMTI to support getInstances in jvm and forceGc.

getInstances

bash
$ 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],
]

::: tip Through the --limit parameter, you can limit the number of return values to avoid pressure on the JVM when obtaining large data. The default value of limit is 10. :::

Specify classloader name

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

Specify classloader hash

The classloader that loads the class can be found through the sc command.

bash
$ 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

Then use the -c/--classloader parameter to specify:

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

Specify the number of expanded layers of returned results

::: tip The return result of the getInstances action is bound to the instances variable, which is an array.

The expansion level of the result can be specified by the -x/--expand parameter, the default value is 1. :::

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

Execute expression

::: tip The return result of the getInstances action is bound to the instances variable, which is an array. The specified expression can be executed through the --express parameter. :::

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

Force GC

bash
vmtool --action forceGc
  • Use the vmoption command to dynamically turn on the PrintGC option.

Analyze heap usage

heapAnalyze starts from objects reachable from GC Root, counts instance numbers and bytes per class, and prints the top objects/classes by heap usage.

bash
$ vmtool --action heapAnalyze --classNum 5 --objectNum 3

::: tip Use --classNum to specify how many classes will be shown, and use --objectNum to specify how many objects will be shown. :::

Analyze reference chain

referenceAnalyze analyzes instances of a specific class and prints the largest objects and their backtrace chain (from the object back to GC Root) to help locate them.

bash
$ vmtool --action referenceAnalyze --className java.lang.String --objectNum 5 --backtraceNum 3

::: tip

  • Use --objectNum to specify how many objects will be shown
  • Use --backtraceNum to specify how many steps of backtrace will be done, set -1 to backtrace until root, set 0 to disable backtrace output
  • --classLoaderClass and --classloader from getInstances are also applicable here :::

interrupt 指定线程

The thread id is specified by the -t parameter. It can be obtained using the thread command.

bash
vmtool --action interruptThread -t 1

glibc Release Free Memory

Linux man page: malloc_trim

bash
vmtool --action mallocTrim

glibc Memory Status

The memory status will be output to the application's stderr. Linux man page: malloc_stats

bash
vmtool --action mallocStats

The output to stderr is as follows:

Arena 0:
system bytes     =     135168
in use bytes     =      74352
Total (incl. mmap):
system bytes     =     135168
in use bytes     =      74352
max mmap regions =          0
max mmap bytes   =          0