1 heapdump-生成dump文件
[arthas@4671]$ heapdump
Dumping heap to /var/folders/kt/nb8xgh3x1tz_r8ntr828mw500000gn/T/heapdump2020-03-08-11-271776578985687027698.hprof...
Heap dump file created
[arthas@4671]$
2 syspro-查看系統屬性
這裏查詢的是一些啓動參數,特別是jar -D啓動時候配置的一些參數,都可以方便進行查詢;
sysprop
3 sysenv-系統環境變量查看
查看系統環境信息;
4 sc-查看jvm加載類的詳細信息
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
[arthas@4671]$ sc -d demo.MathGame
class-info demo.MathGame
code-source /Users/fwd/03-fwd_git/05-fly-higher-in-java/015-arthas/ope
ncode/arthas-demo.jar
name demo.MathGame
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@55f96302
+-sun.misc.Launcher$ExtClassLoader@1540e19d
classLoaderHash 55f96302
5 sm - 查看jvm加載類的方法信息
sm -d demo.MathGame
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 .*
6 dump - 從jvm輸出類的字節碼
dump java.lang.String
dump -d /tmp/output java.lang.String
dump org/apache/commons/lang/StringUtils
dump *StringUtils
dump -E org\\.apache\\.commons\\.lang\\.StringUtils
7 jad - 反編譯類文件
jad java.lang.String
jad java.lang.String toString
jad --source-only java.lang.String
jad -c 39eb305e org/apache/log4j/Logger
jad -c 39eb305e -E org\\.apache\\.*\\.StringUtils
8 mc - 熱更新代碼之編譯java生成class
Memory Compiler/內存編譯器,編譯
.java
文件生成.class
。
mc /tmp/Test.java
可以通過-c
參數指定classloader:
mc -c 327a647b /tmp/Test.java
可以通過-d
命令指定輸出目錄:
mc -d /tmp/output /tmp/ClassA.java /tmp/ClassB.java
編譯生成.class
文件之後,可以結合redefine命令實現熱更新代碼。
9 redefine - 熱更新代碼之重新加載修改class
redefine命令實際上實現了任意代碼線上debug的功能,可以隨意本地修改代碼重新編繹,然後線上redefine加載
注意, redefine後的原來的類不能恢復,redefine有可能失敗(比如增加了新的field),參考jdk本身的文檔。
reset
命令對redefine
的類無效。如果想重置,需要redefine
原始的字節碼。
redefine
命令和jad
/watch
/trace
/monitor
/tt
等命令會衝突。執行完redefine
之後,如果再執行上面提到的命令,則會把redefine
的字節碼重置。 原因是jdk本