From 2ff6ec16c6201b7338937aa9094a4d3f8447ebb2 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Fri, 21 Sep 2018 11:29:23 +0800 Subject: [PATCH] update doc --- en/_sources/classloader.md.txt | 129 +++++++++ en/_sources/dump.md.txt | 40 +++ en/_sources/getstatic.md.txt | 24 ++ en/_sources/jad.md.txt | 158 +++++++++++ en/_sources/jvm.md.txt | 97 +++++++ en/_sources/sc.md.txt | 68 +++++ en/_sources/sm.md.txt | 89 +++++++ en/_sources/sysprop.md.txt | 122 +++++++++ en/_sources/thread.md.txt | 166 ++++++++++++ en/advanced-use.html | 18 +- en/classloader.html | 427 ++++++++++++++++++++++++++++++ en/commands.html | 36 +-- en/dashboard.html | 21 +- en/dump.html | 335 ++++++++++++++++++++++++ en/getstatic.html | 295 +++++++++++++++++++++ en/jad.html | 452 ++++++++++++++++++++++++++++++++ en/jvm.html | 377 +++++++++++++++++++++++++++ en/objects.inv | 4 +- en/sc.html | 374 ++++++++++++++++++++++++++ en/searchindex.js | 2 +- en/sm.html | 383 +++++++++++++++++++++++++++ en/sysprop.html | 403 ++++++++++++++++++++++++++++ en/thread.html | 463 +++++++++++++++++++++++++++++++++ 23 files changed, 4444 insertions(+), 39 deletions(-) create mode 100644 en/_sources/classloader.md.txt create mode 100644 en/_sources/dump.md.txt create mode 100644 en/_sources/getstatic.md.txt create mode 100644 en/_sources/jad.md.txt create mode 100644 en/_sources/jvm.md.txt create mode 100644 en/_sources/sc.md.txt create mode 100644 en/_sources/sm.md.txt create mode 100644 en/_sources/sysprop.md.txt create mode 100644 en/_sources/thread.md.txt create mode 100644 en/classloader.html create mode 100644 en/dump.html create mode 100644 en/getstatic.html create mode 100644 en/jad.html create mode 100644 en/jvm.html create mode 100644 en/sc.html create mode 100644 en/sm.html create mode 100644 en/sysprop.html create mode 100644 en/thread.html diff --git a/en/_sources/classloader.md.txt b/en/_sources/classloader.md.txt new file mode 100644 index 000000000..bfa14936a --- /dev/null +++ b/en/_sources/classloader.md.txt @@ -0,0 +1,129 @@ +classloader +=========== + +Check the inheritance tree, urls and classes loading profiles of the class loaders. + +It can be a great help for `ResourceNotFoundException` when you can use command `classloader`to specify a class loader to `getResources` and print all the urls of the valid resources. + +### Options + +|Name|Specification| +|---:|:---| +|[l]|count based on the class loader instance| +|[t]|print all the inheritance structure of the class loaders| +|[a]|list all the classes loaded by all the class loaders (use it with great caution since the output can be huge)| +|`[c:]`|get the hashcode of the class loader| +|`[c: r:]`|using class loader to search resource| + +### Usage + +* categorised by class loader + +```s +$ classloader + name numberOfInstances loadedCountTotal + com.taobao.pandora.service.loader.ModuleClassLoader 29 11659 + com.taobao.pandora.boot.loader.ReLaunchURLClassLoader 1 5308 + BootstrapClassLoader 1 3711 + com.taobao.arthas.agent.ArthasClassloader 2 2825 + sun.reflect.DelegatingClassLoader 332 332 + java.net.URLClassLoader 1 285 + sun.misc.Launcher$AppClassLoader 1 77 + sun.misc.Launcher$ExtClassLoader 1 46 + com.alibaba.fastjson.util.ASMClassLoader 2 3 + org.jvnet.hk2.internal.DelegatingClassLoader 2 2 + sun.reflect.misc.MethodUtil 1 1 +Affect(row-cnt:11) cost in 66 ms. +``` + +* Categorized by class loader instance + +```sh +$ classloader -l + name loadedCount hash parent + BootstrapClassLoader 3711 null null + com.alibaba.fastjson.util.ASMClassLoader@3bbaa1b8 2 3bbaa1b8 monitor's ModuleClassLoader + com.alibaba.fastjson.util.ASMClassLoader@5e255d0b 1 5e255d0b eagleeye-core's ModuleClassLoader + com.taobao.arthas.agent.ArthasClassloader@4fa2d7e6 1795 4fa2d7e6 sun.misc.Launcher$ExtClassLoader@a38d7a3 + com.taobao.arthas.agent.ArthasClassloader@522400c2 1033 522400c2 sun.misc.Launcher$ExtClassLoader@a38d7a3 + com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444 5308 1817d444 sun.misc.Launcher$AppClassLoader@14dad5dc + tbsession's ModuleClassLoader 285 609cd4d8 null + pandora-qos-service's ModuleClassLoader 267 2f8dad04 null + pandora-framework's ModuleClassLoader 78 4009e306 null + filesync-client's ModuleClassLoader 4 4b8ee4de null + rocketmq-client's ModuleClassLoader 431 247bddad null + eagleeye-core's ModuleClassLoader 451 1ba9117e null + alimonitor-jmonitor's ModuleClassLoader 134 22fcf7ab null + metaq-client's ModuleClassLoader 35 41a2befb null + hsf-mock's ModuleClassLoader 3 2002fc1d null + monitor's ModuleClassLoader 1427 131ef10 null + spas-sdk-service's ModuleClassLoader 7 10d307f1 null + vipserver-client's ModuleClassLoader 137 7a419da4 null + metrics's ModuleClassLoader 146 696da30b null + mtop-uncenter's ModuleClassLoader 922 79d8407f null + spas-sdk-client's ModuleClassLoader 235 4944252c null + live-profiler-pandora's ModuleClassLoader 1 6913c1fb null + notify-tr-client's ModuleClassLoader 472 fba92d3 null + ons-sdk's ModuleClassLoader 70 23348b5d null + tair-plugin's ModuleClassLoader 1053 7c9d8e2 null + tddl-client's ModuleClassLoader 2354 4988d8b8 null + config-client's ModuleClassLoader 93 429bffaa null + diamond-client's ModuleClassLoader 360 3d5c822d null + pandolet's ModuleClassLoader 99 41e1e210 null + hsf's ModuleClassLoader 1796 3232a28a null + acl.plugin's ModuleClassLoader 379 67080771 null + buc.sso.client.plugin's ModuleClassLoader 195 13b6aecc null + unitrouter's ModuleClassLoader 64 7e5afaa6 null + switch's ModuleClassLoader 104 24313fcc null + hsf-notify-client's ModuleClassLoader 57 4d0f2471 null + java.net.URLClassLoader@7ec7ffd3 285 7ec7ffd3 sun.misc.Launcher$ExtClassLoader@a38d7a3 + javax.management.remote.rmi.NoCallStackClassLoader@53f65459 1 53f65459 null + javax.management.remote.rmi.NoCallStackClassLoader@2833cc44 1 2833cc44 null + org.jvnet.hk2.internal.DelegatingClassLoader@72cda8ee 1 72cda8ee monitor's ModuleClassLoader + org.jvnet.hk2.internal.DelegatingClassLoader@1f57f96d 1 1f57f96d monitor's ModuleClassLoader + sun.misc.Launcher$AppClassLoader@14dad5dc 77 14dad5dc sun.misc.Launcher$ExtClassLoader@a38d7a3 + sun.misc.Launcher$ExtClassLoader@a38d7a3 46 a38d7a3 null + sun.reflect.misc.MethodUtil@1201f221 1 1201f221 sun.misc.Launcher$AppClassLoader@14dad5dc +``` + +* Check inheritance tree of the class loaders + +```shell +$ classloader -t ++-BootstrapClassLoader ++-unitrouter's ModuleClassLoader ++-diamond-client's ModuleClassLoader ++-sun.misc.Launcher$ExtClassLoader@548a102f +| +-sun.misc.Launcher$AppClassLoader@14dad5dc +| +-com.taobao.arthas.agent.AgentLauncher$1@334e6bb8 +| | +-sun.reflect.DelegatingClassLoader@328b3a05 +| | +-sun.reflect.DelegatingClassLoader@73f44f24 +``` + +* Check the real urls of `URLClassLoader` + +```shell +$ classloader -c 5ffe9775 +file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/commons-lang-2.6.jar +file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/log4j-1.2.16.jar +file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/logger.api-0.1.4.jar +file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.api-2.0.7-SNAPSHOT.jar +file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.container-2.0.7-SNAPSHOT.jar +file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.thirdcontainer-2.0.7-SNAPSHOT.jar +file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/picocontainer-2.14.3.jar +``` + +* Using class loader to search for resource + +```shell +$ classloader -c 226b143b -r META-INF/MANIFEST.MF + jar:file:/Users/hello/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar!/META-INF/MANIFEST.MF + jar:file:/Users/hello/.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar!/META-INF/MANIFEST.MF +``` + +* Using class loader to look for `*.class` file + +```shell +$ classloader -c 1b6d3586 -r java/lang/String.class + jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class +``` diff --git a/en/_sources/dump.md.txt b/en/_sources/dump.md.txt new file mode 100644 index 000000000..ac3089c59 --- /dev/null +++ b/en/_sources/dump.md.txt @@ -0,0 +1,40 @@ +dump +=== + +Dump the bytecode the loaded classes to a specified directory. + +### Options + +|Name|Specification| +|---:|:---| +|*class-pattern*|pattern for the class name| +|`[c:]`|hashcode of the class loader that loaded the class| +|[E]|turn on regx matching while the default is wildcards matching| + +### Usage + +```shell +$ dump -E org\.apache\.commons\.lang\.StringUtils + HASHCODE CLASSLOADER LOCATION + 29505d69 +-tddl-client's ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora + .service.loader.ModuleClassLoader-29505d69/org.apache.commons.lang.StringUtils.class + 6e51ad67 +-java.net.URLClassLoader@6e51ad67 /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL + +-sun.misc.Launcher$AppClassLoader@6951a712 oader-6e51ad67/org.apache.commons.lang.StringUtils.class + +-sun.misc.Launcher$ExtClassLoader@6fafc4c2 + 2bdd9114 +-pandora-qos-service's ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora + .service.loader.ModuleClassLoader-2bdd9114/org.apache.commons.lang.StringUtils.class + 544dc9ba +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.tomcat. + +-org.apache.catalina.loader.StandardClassLoader@2302e984 container.context.loader.AliWebappClassLoader-544dc9ba/org.apache.commons.lang.String + +-sun.misc.Launcher$AppClassLoader@6951a712 Utils.class + +-sun.misc.Launcher$ExtClassLoader@6fafc4c2 + 22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL + +-sun.misc.Launcher$AppClassLoader@6951a712 oader-22880c2b/org.apache.commons.lang.StringUtils.class + +-sun.misc.Launcher$ExtClassLoader@6fafc4c2 +Affect(row-cnt:5) cost in 156 ms. +$ dump -E org\.apache\.commons\.lang\.StringUtils -c 22880c2b + HASHCODE CLASSLOADER LOCATION + 22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassLoader-22880c2b/org + +-sun.misc.Launcher$AppClassLoader@6951a712 .apache.commons.lang.StringUtils.class + +-sun.misc.Launcher$ExtClassLoader@6fafc4c2 +Affect(row-cnt:1) cost in 67 ms. +``` diff --git a/en/_sources/getstatic.md.txt b/en/_sources/getstatic.md.txt new file mode 100644 index 000000000..a6927f511 --- /dev/null +++ b/en/_sources/getstatic.md.txt @@ -0,0 +1,24 @@ +getstatic +========= + +Check the static fields of classes conveniently as `getstatic class_name field_name` + +Tip: if the *field* is a composite object, you can even use [`OGNL`](https://en.wikipedia.org/wiki/OGNL) to traverse, filter and access the internal properties of it. + +E.g. suppose `n` is a `Map` and the key is a `Enum` then if you want to get the key with a specific `Enum` value - `STOP` or `a`, you can achieve it as: + +``` +$ getstatic com.alibaba.arthas.Test n 'entrySet().iterator.{? #this.key.name()=="STOP"}' +field: n +@ArrayList[ + @Node[STOP=bbb], +] +Affect(row-cnt:1) cost in 68 ms. + + +$ getstatic com.alibaba.arthas.Test m 'entrySet().iterator.{? #this.key=="a"}' +field: m +@ArrayList[ + @Node[a=aaa], +] +``` diff --git a/en/_sources/jad.md.txt b/en/_sources/jad.md.txt new file mode 100644 index 000000000..31c146015 --- /dev/null +++ b/en/_sources/jad.md.txt @@ -0,0 +1,158 @@ +jad +=== + +De-compile specified loaded classes. + +`jad` helps to *de-compile* the byte code in JVM to the source code to assist you to better understand the logic behind. + +F.Y.I +* the de-compiled code will be grammatically highlighted for readability in Arthas Console; +* you have to understand there might be some trivial grammar errors but it won't affect the logic understanding. + +### Options + +|Name|Specification| +|---:|:---| +|*class-pattern*|pattern for the class name| +|`[c:]`|hashcode of the class loader that loaded the class| +|[E]|turn on regx matching while the default is wildcards matching| + +### Usage + +When several class loaders loaded the same class: +1. `jad` to get the hashcode of the class loader; +2. `jad -c ` to get the de-compiled class loaded by the class loader. + +```java +$ jad org.apache.log4j.Logger + + Found more than one class for: org.apache.log4j.Logger, Please use jad -c hashcode org.apache.log4j.Logger + HASHCODE CLASSLOADER + 69dcaba4 +-monitor's ModuleClassLoader + 6e51ad67 +-java.net.URLClassLoader@6e51ad67 + +-sun.misc.Launcher$AppClassLoader@6951a712 + +-sun.misc.Launcher$ExtClassLoader@6fafc4c2 + 2bdd9114 +-pandora-qos-service's ModuleClassLoader + 4c0df5f8 +-pandora-framework's ModuleClassLoader + +Affect(row-cnt:0) cost in 38 ms. +$ jad org.apache.log4j.Logger -c 69dcaba4 + +ClassLoader: ++-monitor's ModuleClassLoader + +Location: +/Users/zhuyong/Downloads/taobao-hsf.sar/plugins/monitor/lib/log4j-1.2.14.jar + +package org.apache.log4j; + +import org.apache.log4j.spi.*; + +public class Logger extends Category +{ + private static final String FQCN; + + protected Logger(String name) + { + super(name); + } + + public static Logger getLogger(String name) + { + return LogManager.getLogger(name); + } + + public static Logger getLogger(Class clazz) + { + return LogManager.getLogger(clazz.getName()); + } + + public static Logger getRootLogger() + { + return LogManager.getRootLogger(); + } + + public static Logger getLogger(String name, LoggerFactory factory) + { + return LogManager.getLogger(name, factory); + } + + public void trace(Object message) + { + if (repository.isDisabled(5000)) + { + return; + } + if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel())) + { + forcedLog(Logger.FQCN, Level.TRACE, message, null); + } + } + + public void trace(Object message, Throwable t) + { + if (repository.isDisabled(5000)) + { + return; + } + if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel())) + { + forcedLog(Logger.FQCN, Level.TRACE, message, t); + } + } + + public boolean isTraceEnabled() + { + if (repository.isDisabled(5000)) + { + return false; + } + return Level.TRACE.isGreaterOrEqual(getEffectiveLevel()); + } + + static + { + Logger.FQCN = Logger.class.getName(); + } + +} + +Affect(row-cnt:1) cost in 190 ms. +``` + +De-compile the specified method: + +```sh +$ jad com.taobao.container.web.arthas.rest.MetricsController directMetrics + +ClassLoader: ++-com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444 + +-sun.misc.Launcher$AppClassLoader@14dad5dc + +-sun.misc.Launcher$ExtClassLoader@a38d7a3 + +Location: +/Users/zhuyong/middleware/tomcat-web/tomcat-web-web/target/classes/ + +private Map directMetrics(String ip, String[] metrics) { + JSONObject obj; + HashMap result = new HashMap(); + result.put("success", false); + String metricUrl = "http://" + ip + ":8006/metrics/specific"; + String postBody = Arrays.stream(metrics).map(metric -> "metric=" + metric).collect(Collectors.joining("&")); + HttpClientUtils.Response resp = HttpClientUtils.sendPostRequest((String)metricUrl, (String)postBody); + if (resp.isSuccess() && (obj = JSON.parseObject(resp.getContent())).containsKey("success") && obj.getBoolean("success").booleanValue() && obj.containsKey("data")) { + JSONArray dataArray = obj.getJSONArray("data"); + HashMap metricMap = new HashMap(); + for (Object aDataArray : dataArray) { + JSONObject o = (JSONObject)aDataArray; + metricMap.put(o.getString("metric"), o.get("value")); + } + result.put("data", metricMap); + result.put("success", true); + return result; + } + return result; +} + +Affect(row-cnt:1) cost in 1508 ms. +``` diff --git a/en/_sources/jvm.md.txt b/en/_sources/jvm.md.txt new file mode 100644 index 000000000..25fe20325 --- /dev/null +++ b/en/_sources/jvm.md.txt @@ -0,0 +1,97 @@ +jvm +=== + +Check the JVM profile + +### Usage + +``` +$ jvm + CATEGORY INFO +------------------------------------------------------------------------------------------------------------------------------------ + + RUNTIME MACHINE-NAME hellodeMacBook-Air.local + JVM-START-TIME 2015-12-23 10:54:18 + MANAGEMENT-SPEC-VERSION 1.2 + SPEC-NAME Java Virtual Machine Specification + SPEC-VENDOR Oracle Corporation + SPEC-VERSION 1.8 + VM-NAME Java HotSpot(TM) 64-Bit Server VM + VM-VENDOR Oracle Corporation + VM-VERSION 25.60-b23 + INPUT-ARGUMENTS -Xbootclasspath/a:/Users/hello/.jenv/versions/1.8/lib/tools.jar + -Djava.util.logging.config.file=/Users/hello/code/java/crash/packaging/target/ + conf/logging.properties + + CLASS-PATH /Users/hello/.jenv/versions/1.8/lib/tools.jar:/Users/hello/code/java/cras + h/packaging/target/bin/crash.cli-1.3.2-SNAPSHOT.jar::/Users/hello/code/java/cr + ash/packaging/target/lib/bcpkix-jdk15on-1.51.jar:/Users/hello/code/java/crash/ + packaging/target/lib/bcprov-jdk15on-1.51.jar:/Users/hello/code/java/crash/pack + aging/target/lib/crash.connectors.ssh-1.3.2-SNAPSHOT-standalone.jar:/Users/hengyuna + bc/code/java/crash/packaging/target/lib/crash.connectors.telnet-1.3.2-SNAPSHOT-stan + dalone.jar:/Users/hello/code/java/crash/packaging/target/lib/crash.shell-1.3.2 + -SNAPSHOT.jar:/Users/hello/code/java/crash/packaging/target/lib/groovy-all-1.8 + .9.jar:/Users/hello/code/java/crash/packaging/target/lib/ivy-2.2.0.jar + BOOT-CLASS-PATH /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/resources.j + ar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar:/ + Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/sunrsasign.j + ar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/jsse.jar + :/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/jce.jar:/L + ibrary/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/charsets.jar: + /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/jfr.jar:/Li + brary/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/classes:/Users/hen + gyunabc/.jenv/versions/1.8/lib/tools.jar + LIBRARY-PATH /Users/hello/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library + /Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. + + CLASS-LOADING LOADED-CLASS-COUNT 4264 + TOTAL-LOADED-CLASS-COUNT 4264 + UNLOADED-CLASS-COUNT 0 + IS-VERBOSE false + + COMPILATION NAME HotSpot 64-Bit Tiered Compilers + TOTAL-COMPILE-TIME 5145(ms) + + GARBAGE-COLLECTORS PS Scavenge 6/74(ms) + [count/time] + PS MarkSweep 1/64(ms) + [count/time] + + MEMORY-MANAGERS CodeCacheManager Code Cache + + Metaspace Manager Metaspace + Compressed Class Space + + PS Scavenge PS Eden Space + PS Survivor Space + + PS MarkSweep PS Eden Space + PS Survivor Space + PS Old Gen + + + MEMORY HEAP-MEMORY-USAGE 186646528/134217728/1908932608/31245568 + [committed/init/max/used] + NO-HEAP-MEMORY-USAGE 35520512/2555904/-1/34584616 + [committed/init/max/used] + PENDING-FINALIZE-COUNT 0 + + OPERATING-SYSTEM OS Mac OS X + ARCH x86_64 + PROCESSORS-COUNT 4 + LOAD-AVERAGE 2.328125 + VERSION 10.10.5 + + THREAD COUNT 16 + DAEMON-COUNT 10 + LIVE-COUNT 18 + STARTED-COUNT 19 +Affect cost in 2 ms. +``` + +### thread-related + +* COUNT: the count of active threads +* DAEMON-COUNT: the count of active daemon threads +* LIVE-COUNT: the maximum count of the live threads since JVM starts +* STARTED-COUNT: the total count of the created threads since JVM starts diff --git a/en/_sources/sc.md.txt b/en/_sources/sc.md.txt new file mode 100644 index 000000000..23eb6af1d --- /dev/null +++ b/en/_sources/sc.md.txt @@ -0,0 +1,68 @@ +sc +== + +Check the profiles of the loaded classes. + +Abbreviated from “Search-Class”; with the help of this command, you can search out all the loaded classes in JVM. Supported options are: `[d]`、`[E]`、`[f]` and `[x:]`. + +Options +------- + +### Specification + +|Name|Specification| +|---:|:---| +|*class-pattern*|pattern for the class name| +|*method-pattern*|pattern for the method name| +|[d]|print the details of the current class including the source file, class declaration, the class loaders and the like.
F.Y.I if a class is loaded by several class loaders, then the class will be printed several times| +|[E]|turn on regx matching while the default is wildcards matching| +|[f]|print the fields info of the current class, which should be used along with `-d`| +|[x:]|the depth to print the static fields, whose default is `0` - directly invoke the `toString()`| + +Tip: +1. *class-patten* supports full qualified class name (e.g. com.taobao.test.AAA and com/taobao/test/AAA) +2. `sc` turned on the `sub-class` matching in default mode, if you do want to hide the `sub-class` please just turn it off via `options disable-sub-class true`. + +### Usage + +Check the static fields of a class using `sc -df class-name` + +```shell +$ sc -df org.apache.commons.lang.StringUtils + + class-info org.apache.commons.lang.StringUtils + code-source /Users/zhuyong/middleware/citrus-sample/petstore/web/target/petstore/WEB-INF/lib/commons-lang-2.4.jar + name org.apache.commons.lang.StringUtils + isInterface false + isAnnotation false + isEnum false + isAnonymousClass false + isArray false + isLocalClass false + isMemberClass false + isPrimitive false + isSynthetic false + simple-name StringUtils + modifier public + annotation + interfaces + super-class +-java.lang.Object + class-loader +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader + +-org.apache.catalina.loader.StandardClassLoader@1d44eef3 + +-sun.misc.Launcher$AppClassLoader@57a462c9 + +-sun.misc.Launcher$ExtClassLoader@6951a712 + fields modifier final,public,static + type java.lang.String + name EMPTY + value + + modifier final,public,static + type int + name INDEX_NOT_FOUND + value -1 + + modifier final,private,static + type int + name PAD_LIMIT + value 8192 +``` diff --git a/en/_sources/sm.md.txt b/en/_sources/sm.md.txt new file mode 100644 index 000000000..3f0496cee --- /dev/null +++ b/en/_sources/sm.md.txt @@ -0,0 +1,89 @@ +sm +== + +Check the method profile of the loaded classes; + +Abbreviated from “Search-Method”, with which you can search out all methods profiles of the loaded classes. + +F.Y.I +`sm` only shows the methods declared in the current class; methods declared in ancestors will not be presented. + +### Options + +|Name|Specification| +|---:|:---| +|*class-pattern*|pattern for class name| +|*method-pattern*|pattern for method name| +|[d]|print the details of the method| +|[E]|turn the regex matching on while the default mode is wildcards matching| + +### Usage + +``` +$ sm org.apache.catalina.connector.Connector +org.apache.catalina.connector.Connector-> +org.apache.catalina.connector.Connector->setProperty +org.apache.catalina.connector.Connector->getProperty +org.apache.catalina.connector.Connector->toString +org.apache.catalina.connector.Connector->resume +org.apache.catalina.connector.Connector->getScheme +org.apache.catalina.connector.Connector->getProtocol +org.apache.catalina.connector.Connector->getPort +org.apache.catalina.connector.Connector->setService +org.apache.catalina.connector.Connector->setPort +org.apache.catalina.connector.Connector->getService +org.apache.catalina.connector.Connector->getAttribute +org.apache.catalina.connector.Connector->setAttribute +org.apache.catalina.connector.Connector->getLocalPort +org.apache.catalina.connector.Connector->pause +org.apache.catalina.connector.Connector->setProtocol +org.apache.catalina.connector.Connector->initInternal +org.apache.catalina.connector.Connector->setSecure +org.apache.catalina.connector.Connector->getSecure +org.apache.catalina.connector.Connector->startInternal +org.apache.catalina.connector.Connector->stopInternal +org.apache.catalina.connector.Connector->setScheme +org.apache.catalina.connector.Connector->createRequest +org.apache.catalina.connector.Connector->getDomainInternal +org.apache.catalina.connector.Connector->getProtocolHandler +org.apache.catalina.connector.Connector->setURIEncoding +org.apache.catalina.connector.Connector->findSslHostConfigs +org.apache.catalina.connector.Connector->destroyInternal +org.apache.catalina.connector.Connector->getObjectNameKeyProperties +org.apache.catalina.connector.Connector->getAllowTrace +org.apache.catalina.connector.Connector->setAllowTrace +org.apache.catalina.connector.Connector->getAsyncTimeout +org.apache.catalina.connector.Connector->setAsyncTimeout +org.apache.catalina.connector.Connector->getEnableLookups +org.apache.catalina.connector.Connector->setEnableLookups +org.apache.catalina.connector.Connector->getMaxCookieCount +... + +``` + +```sh +$ sm org.apache.catalina.connector.Connector -d + declaring-class org.apache.catalina.connector.Connector + constructor-name + modifier public + annotation + parameters + exceptions + + declaring-class org.apache.catalina.connector.Connector + constructor-name + modifier public + annotation + parameters java.lang.String + exceptions + + declaring-class org.apache.catalina.connector.Connector + method-name setProperty + modifier public + annotation + parameters java.lang.String + java.lang.String + return boolean + exceptions + ...... +``` diff --git a/en/_sources/sysprop.md.txt b/en/_sources/sysprop.md.txt new file mode 100644 index 000000000..6aa630733 --- /dev/null +++ b/en/_sources/sysprop.md.txt @@ -0,0 +1,122 @@ +sysprop +======= + +Check the JVM system properties. + +### Usage + +``` + USAGE: + sysprop [-h] [property-name] [property-value] + + SUMMARY: + Display, and change all the system properties. + + EXAMPLES: + sysprop + sysprop file.encoding + sysprop production.mode true + + WIKI: + https://alibaba.github.io/arthas/sysprop + + OPTIONS: + -h, --help this help + property name + property value +``` + +#### Check all properties + + +``` +$ sysprop + KEY VALUE +------------------------------------------------------------------------------------------------------------------------------------- + java.runtime.name Java(TM) SE Runtime Environment + sun.boot.library.path /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib + java.vm.version 25.51-b03 + user.country.format CN + gopherProxySet false + java.vm.vendor Oracle Corporation + java.vendor.url http://java.oracle.com/ + path.separator : + java.vm.name Java HotSpot(TM) 64-Bit Server VM + file.encoding.pkg sun.io + user.country US + sun.java.launcher SUN_STANDARD + sun.os.patch.level unknown + java.vm.specification.name Java Virtual Machine Specification + user.dir /private/var/tmp + java.runtime.version 1.8.0_51-b16 + java.awt.graphicsenv sun.awt.CGraphicsEnvironment + java.endorsed.dirs /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/endors + ed + os.arch x86_64 + java.io.tmpdir /var/folders/2c/tbxwzs4s4sbcvh7frbcc7n000000gn/T/ + line.separator + + java.vm.specification.vendor Oracle Corporation + os.name Mac OS X + sun.jnu.encoding UTF-8 + java.library.path /Users/wangtao/Library/Java/Extensions:/Library/Java/Extensions:/Network/Libra + ry/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. + sun.nio.ch.bugLevel + java.specification.name Java Platform API Specification + java.class.version 52.0 + sun.management.compiler HotSpot 64-Bit Tiered Compilers + os.version 10.12.6 + user.home /Users/wangtao + user.timezone Asia/Shanghai + java.awt.printerjob sun.lwawt.macosx.CPrinterJob + file.encoding UTF-8 + java.specification.version 1.8 + user.name wangtao + java.class.path . + java.vm.specification.version 1.8 + sun.arch.data.model 64 + java.home /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre + sun.java.command Test + java.specification.vendor Oracle Corporation + user.language en + awt.toolkit sun.lwawt.macosx.LWCToolkit + java.vm.info mixed mode + java.version 1.8.0_51 + java.ext.dirs /Users/wangtao/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1. + 8.0_51.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library + /Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java + sun.boot.class.path /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/resour + ces.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/li + b/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/l + ib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/H + ome/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Content + s/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Conte + nts/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jd + k/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51. + jdk/Contents/Home/jre/classes + java.vendor Oracle Corporation + file.separator / + java.vendor.url.bug http://bugreport.sun.com/bugreport/ + sun.cpu.endian little + sun.io.unicode.encoding UnicodeBig + sun.cpu.isalist +``` + +#### Check a single property + +Tip: `tab` auto-completion supported + +``` +$ sysprop java.version +java.version=1.8.0_51 +``` + +#### Modify a single property + +``` +$ sysprop user.country +user.country=US +$ sysprop user.country CN +Successfully changed the system property. +user.country=CN +``` diff --git a/en/_sources/thread.md.txt b/en/_sources/thread.md.txt new file mode 100644 index 000000000..7c9b4b9cd --- /dev/null +++ b/en/_sources/thread.md.txt @@ -0,0 +1,166 @@ +thread +====== + +Check the basic profile and stack trace of the threads. + +### Parameters + +|Name|Specification| +|---:|:---| +|*id*|thread id in JVM| +|[n:]|the top n busiest with stack traces| +|[b]|locate the threads blocking others| +|[i ``]|specify the interval to collect data to compute CPU ratios (ms)| + +How to get the CPU ratios? + +> Within an *specified* interval, the time cost by the thread compared to the total CPU time. +> Take a sample (using `java.lang.management.ThreadMXBean#getThreadCpuTime`) to get the CPU time cost for all the threads and after a *specified* interval (default *100 ms*, which can be specified by `-i`), take another sample and we have the CPU time cost and the ratios naturally. + +> Attention: this kind of operation will take time, to decrease the extra cost, you'd better expand the interval to like `5000 ms` for less performance overhead. + +F.Y.I + +If you'd like to check the CPU ratios from the very start of the Java process, [show-busy-java-threads](https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads) can be a help. + +### Usage + +#### List the top n busiest with detailed stack trace + +```shell +$ thread -n 3 +"as-command-execute-daemon" Id=29 cpuUsage=75% RUNNABLE + at sun.management.ThreadImpl.dumpThreads0(Native Method) + at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440) + at com.taobao.arthas.core.command.monitor200.ThreadCommand$1.action(ThreadCommand.java:58) + at com.taobao.arthas.core.command.handler.AbstractCommandHandler.execute(AbstractCommandHandler.java:238) + at com.taobao.arthas.core.command.handler.DefaultCommandHandler.handleCommand(DefaultCommandHandler.java:67) + at com.taobao.arthas.core.server.ArthasServer$4.run(ArthasServer.java:276) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) + at java.lang.Thread.run(Thread.java:745) + + Number of locked synchronizers = 1 + - java.util.concurrent.ThreadPoolExecutor$Worker@6cd0b6f8 + + + +"as-session-expire-daemon" Id=25 cpuUsage=24% TIMED_WAITING + at java.lang.Thread.sleep(Native Method) + at com.taobao.arthas.core.server.DefaultSessionManager$2.run(DefaultSessionManager.java:85) + + + +"Reference Handler" Id=2 cpuUsage=0% WAITING on java.lang.ref.Reference$Lock@69ba0f27 + at java.lang.Object.wait(Native Method) + - waiting on java.lang.ref.Reference$Lock@69ba0f27 + at java.lang.Object.wait(Object.java:503) + at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) +``` + +#### List all info when no options provided + +```shell +$ thread +Threads Total: 16, NEW: 0, RUNNABLE: 7, BLOCKED: 0, WAITING: 5, TIMED_WAITING: 4, TERMINATED: 0 +ID NAME GROUP PRIORITY STATE %CPU TIME INTERRUPTE DAEMON +30 as-command-execute-daemon system 9 RUNNABLE 72 0:0 false true +23 as-session-expire-daemon system 9 TIMED_WAIT 27 0:0 false true +22 Attach Listener system 9 RUNNABLE 0 0:0 false true +11 pool-2-thread-1 main 5 TIMED_WAIT 0 0:0 false false +12 Thread-2 main 5 RUNNABLE 0 0:0 false true +13 pool-3-thread-1 main 5 TIMED_WAIT 0 0:0 false false +25 as-selector-daemon system 9 RUNNABLE 0 0:0 false true +14 Thread-3 main 5 TIMED_WAIT 0 0:0 false false +26 pool-5-thread-1 system 5 WAITING 0 0:0 false false +15 Thread-4 main 5 RUNNABLE 0 0:0 false false +1 main main 5 WAITING 0 0:2 false false +2 Reference Handler system 10 WAITING 0 0:0 false true +3 Finalizer system 8 WAITING 0 0:0 false true +4 Signal Dispatcher system 9 RUNNABLE 0 0:0 false true +20 NonBlockingInputStreamThread main 5 WAITING 0 0:0 false true +21 Thread-8 main 5 RUNNABLE 0 0:0 false true +``` + +#### thread present the specified thread profile + +```shell +$ thread 1 +"main" Id=1 WAITING on java.util.concurrent.CountDownLatch$Sync@29fafb28 + at sun.misc.Unsafe.park(Native Method) + - waiting on java.util.concurrent.CountDownLatch$Sync@29fafb28 + at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) + at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) + at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997) + at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304) + at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231) +``` + +#### thread -b locate the blocking threads + +Using `-b`, we can effectively locate the threads holding locks blocking other threads resulting in a frozen system. + +```sh +$ thread -b +"http-bio-8080-exec-4" Id=27 TIMED_WAITING + at java.lang.Thread.sleep(Native Method) + at test.arthas.TestThreadBlocking.doGet(TestThreadBlocking.java:22) + - locked java.lang.Object@725be470 <---- but blocks 4 other threads! + at javax.servlet.http.HttpServlet.service(HttpServlet.java:624) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) + at test.filter.TestDurexFilter.doFilter(TestDurexFilter.java:46) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) + at com.taobao.tomcat.valves.ContextLoadFilterValve$FilterChainAdapter.doFilter(ContextLoadFilterValve.java:191) + at com.taobao.eagleeye.EagleEyeFilter.doFilter(EagleEyeFilter.java:81) + at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke(ContextLoadFilterValve.java:150) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:429) + at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) + at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) + at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) + - locked org.apache.tomcat.util.net.SocketWrapper@7127ee12 + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.lang.Thread.run(Thread.java:745) + + Number of locked synchronizers = 1 + - java.util.concurrent.ThreadPoolExecutor$Worker@31a6493e +``` + +> Attention: only `synchronized` blocked threads can be located for now, `JUL` not supported yet. + + +#### thread -i specify the collecting interval + +```sh +$ thread -n 3 -i 1000 +"as-command-execute-daemon" Id=4759 cpuUsage=23% RUNNABLE + at sun.management.ThreadImpl.dumpThreads0(Native Method) + at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440) + at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:133) + at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:79) + at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:96) + at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:27) + at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:125) + at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:122) + at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:332) + at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) + at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) + at java.lang.Thread.run(Thread.java:756) + + Number of locked synchronizers = 1 + - java.util.concurrent.ThreadPoolExecutor$Worker@546aeec1 +... +``` diff --git a/en/advanced-use.html b/en/advanced-use.html index 16352cbb1..92bdf18fd 100644 --- a/en/advanced-use.html +++ b/en/advanced-use.html @@ -201,21 +201,21 @@

JVM-related

  • dashboard - real-time dashboard for the current system
  • -
  • thread - thread profile
  • -
  • jvm - JVM profile
  • -
  • sysprop - check or modify JVM system properties
  • -
  • New! getstatic - check the static properties of some class
  • +
  • thread - thread profile
  • +
  • jvm - JVM profile
  • +
  • sysprop - check or modify JVM system properties
  • +
  • New! getstatic - check the static properties of some class