• Arthas(阿尔萨斯)--(三)


    目录

    一、Arthas学习

    1、class/classloader相关命令一

    1、sc

    2、sm

    2、class/classloader相关命令二

    1、jad

    2、mc

    3、redefine

    三、class/classloader相关命令三


    一、Arthas学习

    Arthas(阿尔萨斯)--(一)

    Arthas(阿尔萨斯)--(二)

    1、class/classloader相关命令一

    1、sc

    sc:Search Class:查看JVM已加载的类信息,“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d][E][f] 和 [x:]

    sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开options disable-sub-class true开关

    参数名称参数说明
    class-pattern类名表达式匹配
    method-pattern方法名表达式匹配
    [d]输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。
    如果一个类被多个 ClassLoader 所加载,则会出现多次
    [E]开启正则表达式匹配,默认为通配符匹配
    [f]输出当前类的成员变量信息(需要配合参数-d 一起使用)
    [x:]指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出
    [c:]指定 class 的 ClassLoader 的 hashcode
    [classLoaderClass:]指定执行表达式的 ClassLoader 的 class name
    [n:]具有详细信息的匹配类的最大数量(默认为 100)
    [cs ]指定 class 的 ClassLoader#toString() 返回值。长格式[classLoaderStr ]
    1. 模糊搜索
    2. [arthas@768]$ sc demo.*
    3. demo.MathGame
    4. Affect(row-cnt:1) cost in 13 ms.
    5. 打印类的详细信息
    6. [arthas@768]$ sc -d demo.MathGame
    7. class-info demo.MathGame
    8. code-source /C:/Users/Administrator/.arthas/lib/3.7.1/arthas/math-game.jar
    9. name demo.MathGame
    10. isInterface false
    11. isAnnotation false
    12. isEnum false
    13. isAnonymousClass false
    14. isArray false
    15. isLocalClass false
    16. isMemberClass false
    17. isPrimitive false
    18. isSynthetic false
    19. simple-name MathGame
    20. modifier public
    21. annotation
    22. interfaces
    23. super-class +-java.lang.Object
    24. class-loader +-jdk.internal.loader.ClassLoaders$AppClassLoader@4aa298b7
    25. +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@364f989
    26. classLoaderHash 4aa298b7
    27. Affect(row-cnt:1) cost in 14 ms.
    28. 打印出类的 Field 信息
    29. [arthas@768]$ sc -d -f demo.MathGame
    30. class-info demo.MathGame
    31. code-source /C:/Users/Administrator/.arthas/lib/3.7.1/arthas/math-game.jar
    32. name demo.MathGame
    33. isInterface false
    34. isAnnotation false
    35. isEnum false
    36. isAnonymousClass false
    37. isArray false
    38. isLocalClass false
    39. isMemberClass false
    40. isPrimitive false
    41. isSynthetic false
    42. simple-name MathGame
    43. modifier public
    44. annotation
    45. interfaces
    46. super-class +-java.lang.Object
    47. class-loader +-jdk.internal.loader.ClassLoaders$AppClassLoader@4aa298b7
    48. +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@364f989
    49. classLoaderHash 4aa298b7
    50. fields name random
    51. type java.util.Random
    52. modifier private,static
    53. value java.util.Random@127d1896
    54. name illegalArgumentCount
    55. type int
    56. modifier private
    57. Affect(row-cnt:1) cost in 12 ms.

    2、sm

    sm:查看已加载类的方法信息

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

    sm 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到。

    参数名称参数说明
    class-pattern类名表达式匹配
    method-pattern方法名表达式匹配
    [d]展示每个方法的详细信息
    [E]开启正则表达式匹配,默认为通配符匹配
    [c:]指定 class 的 ClassLoader 的 hashcode
    [classLoaderClass:]指定执行表达式的 ClassLoader 的 class name
    [n:]具有详细信息的匹配类的最大数量(默认为 100)
    1. 显示String类加载的方法
    2. [arthas@768]$ sm java.lang.String
    3. java.lang.String (Ljava/lang/StringBuilder;)V
    4. java.lang.String ([CIILjava/lang/Void;)V
    5. java.lang.String (Ljava/lang/AbstractStringBuilder;Ljava/lang/Void;)V
    6. java.lang.String (Ljava/nio/charset/Charset;[BII)V
    7. java.lang.String ([BIILjava/nio/charset/Charset;)V
    8. java.lang.String ([BLjava/lang/String;)V
    9. java.lang.String ([BLjava/nio/charset/Charset;)V
    10. java.lang.String ([BII)V
    11. java.lang.String ([B)V
    12. ....
    13. java.lang.String valueOfCodePoint(I)Ljava/lang/String;
    14. java.lang.String describeConstable()Ljava/util/Optional;
    15. java.lang.String lambda$stripIndent$3(ILjava/lang/String;)Ljava/lang/String;
    16. java.lang.String lambda$indent$2(ILjava/lang/String;)Ljava/lang/String;
    17. java.lang.String lambda$indent$1(Ljava/lang/String;)Ljava/lang/String;
    18. java.lang.String lambda$indent$0(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    19. Affect(row-cnt:167) cost in 24 ms.
    1. [arthas@768]$ sm -d java.lang.String toString
    2. declaring-class java.lang.String
    3. method-name toString
    4. modifier public
    5. annotation
    6. parameters
    7. return java.lang.String
    8. exceptions
    9. classLoaderHash null
    10. Affect(row-cnt:1) cost in 7 ms.
    1. [arthas@768]$ sm demo.MathGame
    2. demo.MathGame ()V
    3. demo.MathGame main([Ljava/lang/String;)V
    4. demo.MathGame run()V
    5. demo.MathGame print(ILjava/util/List;)V
    6. demo.MathGame primeFactors(I)Ljava/util/List;
    7. Affect(row-cnt:5) cost in 5 ms.

    2、class/classloader相关命令二

    1、jad

    jad:反编译指定已加载类的源码

    jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑;如需批量下载指定包的目录的 class 字节码

    1. $ jad java.lang.String
    2. ClassLoader:
    3. Location:
    4. /*
    5. * Decompiled with CFR.
    6. */
    7. package java.lang;
    8. import java.io.ObjectStreamField;
    9. import java.io.Serializable;
    10. ...
    11. public final class String
    12. implements Serializable,
    13. Comparable,
    14. CharSequence {
    15. private final char[] value;
    16. private int hash;
    17. private static final long serialVersionUID = -6849794470754667710L;
    18. private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
    19. public static final Comparator CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
    20. ...
    21. public String(byte[] byArray, int n, int n2, Charset charset) {
    22. /*460*/ if (charset == null) {
    23. throw new NullPointerException("charset");
    24. }
    25. /*462*/ String.checkBounds(byArray, n, n2);
    26. /*463*/ this.value = StringCoding.decode(charset, byArray, n, n2);
    27. }
    28. ...
    1. 反编译只显示源码
    2. [arthas@768]$ jad --source-only demo.MathGame
    3. /*
    4. * Decompiled with CFR.
    5. */
    6. package demo;
    7. import java.util.ArrayList;
    8. import java.util.List;
    9. import java.util.Random;
    10. import java.util.concurrent.TimeUnit;
    11. public class MathGame {
    12. private static Random random = new Random();
    13. private int illegalArgumentCount = 0;
    14. public static void main(String[] args) throws InterruptedException {
    15. MathGame game = new MathGame();
    16. while (true) {
    17. /*16*/ game.run();
    18. /*17*/ TimeUnit.SECONDS.sleep(1L);
    19. }
    20. }
    21. public void run() throws InterruptedException {
    22. try {
    23. /*23*/ int number = random.nextInt() / 10000;
    24. /*24*/ List primeFactors = this.primeFactors(number);
    25. /*25*/ MathGame.print(number, primeFactors);
    26. }
    27. catch (Exception e) {
    28. /*28*/ System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage());
    29. }
    30. }
    31. public static void print(int number, List primeFactors) {
    32. StringBuffer sb = new StringBuffer(number + "=");
    33. /*34*/ for (int factor : primeFactors) {
    34. /*35*/ sb.append(factor).append('*');
    35. }
    36. /*37*/ if (sb.charAt(sb.length() - 1) == '*') {
    37. /*38*/ sb.deleteCharAt(sb.length() - 1);
    38. }
    39. /*40*/ System.out.println(sb);
    40. }
    41. public List primeFactors(int number) {
    42. /*44*/ if (number < 2) {
    43. /*45*/ ++this.illegalArgumentCount;
    44. throw new IllegalArgumentException("number is: " + number + ", need >= 2");
    45. }
    46. ArrayList result = new ArrayList();
    47. /*50*/ int i = 2;
    48. /*51*/ while (i <= number) {
    49. /*52*/ if (number % i == 0) {
    50. /*53*/ result.add(i);
    51. /*54*/ number /= i;
    52. /*55*/ i = 2;
    53. continue;
    54. }
    55. /*57*/ ++i;
    56. }
    57. /*61*/ return result;
    58. }
    59. }

    反编译指定函数

    1. [arthas@768]$ jad demo.MathGame main
    2. ClassLoader:
    3. +-jdk.internal.loader.ClassLoaders$AppClassLoader@4aa298b7
    4. +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@364f989
    5. Location:
    6. /C:/Users/Administrator/.arthas/lib/3.7.1/arthas/math-game.jar
    7. public static void main(String[] args) throws InterruptedException {
    8. MathGame game = new MathGame();
    9. while (true) {
    10. /*16*/ game.run();
    11. /*17*/ TimeUnit.SECONDS.sleep(1L);
    12. }
    13. }
    14. Affect(row-cnt:1) cost in 117 ms.

    反编译时不显示行号

    --lineNumber 参数默认值为 true,显示指定为 false 则不打印行号。

    1. [arthas@768]$ jad demo.MathGame main --lineNumber false
    2. ClassLoader:
    3. +-jdk.internal.loader.ClassLoaders$AppClassLoader@4aa298b7
    4. +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@364f989
    5. Location:
    6. /C:/Users/Administrator/.arthas/lib/3.7.1/arthas/math-game.jar
    7. public static void main(String[] args) throws InterruptedException {
    8. MathGame game = new MathGame();
    9. while (true) {
    10. game.run();
    11. TimeUnit.SECONDS.sleep(1L);
    12. }
    13. }
    14. Affect(row-cnt:1) cost in 101 ms.

    反编译时指定 ClassLoader

    1. [arthas@768]$ jad demo.MathGame
    2. ClassLoader:
    3. +-jdk.internal.loader.ClassLoaders$AppClassLoader@4aa298b7
    4. +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@364f989
    5. Location:
    6. /C:/Users/Administrator/.arthas/lib/3.7.1/arthas/math-game.jar
    7. /*
    8. * Decompiled with CFR.
    9. */
    10. package demo;
    11. import java.util.ArrayList;
    12. import java.util.List;
    13. import java.util.Random;
    14. import java.util.concurrent.TimeUnit;
    15. public class MathGame {
    16. private static Random random = new Random();
    17. private int illegalArgumentCount = 0;
    18. public static void main(String[] args) throws InterruptedException {
    19. MathGame game = new MathGame();
    20. while (true) {
    21. /*16*/ game.run();
    22. /*17*/ TimeUnit.SECONDS.sleep(1L);
    23. }
    24. }
    25. public void run() throws InterruptedException {
    26. try {
    27. /*23*/ int number = random.nextInt() / 10000;
    28. /*24*/ List primeFactors = this.primeFactors(number);
    29. /*25*/ MathGame.print(number, primeFactors);
    30. }
    31. catch (Exception e) {
    32. /*28*/ System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage());
    33. }
    34. }
    35. public static void print(int number, List primeFactors) {
    36. StringBuffer sb = new StringBuffer(number + "=");
    37. /*34*/ for (int factor : primeFactors) {
    38. /*35*/ sb.append(factor).append('*');
    39. }
    40. /*37*/ if (sb.charAt(sb.length() - 1) == '*') {
    41. /*38*/ sb.deleteCharAt(sb.length() - 1);
    42. }
    43. /*40*/ System.out.println(sb);
    44. }
    45. public List primeFactors(int number) {
    46. /*44*/ if (number < 2) {
    47. /*45*/ ++this.illegalArgumentCount;
    48. throw new IllegalArgumentException("number is: " + number + ", need >= 2");
    49. }
    50. ArrayList result = new ArrayList();
    51. /*50*/ int i = 2;
    52. /*51*/ while (i <= number) {
    53. /*52*/ if (number % i == 0) {
    54. /*53*/ result.add(i);
    55. /*54*/ number /= i;
    56. /*55*/ i = 2;
    57. continue;
    58. }
    59. /*57*/ ++i;
    60. }
    61. /*61*/ return result;
    62. }
    63. }
    64. Affect(row-cnt:1) cost in 98 ms.
    65. [arthas@768]$ jad demo.MathGame -c 4aa298b7
    66. ClassLoader:
    67. +-jdk.internal.loader.ClassLoaders$AppClassLoader@4aa298b7
    68. +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@364f989
    69. Location:
    70. /C:/Users/Administrator/.arthas/lib/3.7.1/arthas/math-game.jar
    71. /*
    72. * Decompiled with CFR.
    73. */
    74. package demo;
    75. import java.util.ArrayList;
    76. import java.util.List;
    77. import java.util.Random;
    78. import java.util.concurrent.TimeUnit;
    79. public class MathGame {
    80. private static Random random = new Random();
    81. private int illegalArgumentCount = 0;
    82. public static void main(String[] args) throws InterruptedException {
    83. MathGame game = new MathGame();
    84. while (true) {
    85. /*16*/ game.run();
    86. /*17*/ TimeUnit.SECONDS.sleep(1L);
    87. }
    88. }
    89. public void run() throws InterruptedException {
    90. try {
    91. /*23*/ int number = random.nextInt() / 10000;
    92. /*24*/ List primeFactors = this.primeFactors(number);
    93. /*25*/ MathGame.print(number, primeFactors);
    94. }
    95. catch (Exception e) {
    96. /*28*/ System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage());
    97. }
    98. }
    99. public static void print(int number, List primeFactors) {
    100. StringBuffer sb = new StringBuffer(number + "=");
    101. /*34*/ for (int factor : primeFactors) {
    102. /*35*/ sb.append(factor).append('*');
    103. }
    104. /*37*/ if (sb.charAt(sb.length() - 1) == '*') {
    105. /*38*/ sb.deleteCharAt(sb.length() - 1);
    106. }
    107. /*40*/ System.out.println(sb);
    108. }
    109. public List primeFactors(int number) {
    110. /*44*/ if (number < 2) {
    111. /*45*/ ++this.illegalArgumentCount;
    112. throw new IllegalArgumentException("number is: " + number + ", need >= 2");
    113. }
    114. ArrayList result = new ArrayList();
    115. /*50*/ int i = 2;
    116. /*51*/ while (i <= number) {
    117. /*52*/ if (number % i == 0) {
    118. /*53*/ result.add(i);
    119. /*54*/ number /= i;
    120. /*55*/ i = 2;
    121. continue;
    122. }
    123. /*57*/ ++i;
    124. }
    125. /*61*/ return result;
    126. }
    127. }
    128. Affect(row-cnt:1) cost in 81 ms.

    2、mc

    mc:Memory Compiler/内存编译器,编译.java文件生成.class

    3、redefine

    三、class/classloader相关命令三

    一个程序员最重要的能力是:写出高质量的代码!!
    有道无术,术尚可求也,有术无道,止于术。
    无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!

  • 相关阅读:
    【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
    Java基础教程详解:多线程(1)-----多线程概念
    前端开发综合指南:HTML、CSS和JavaScript详解
    WhatsOnChain中的sCrypt合约验证插件
    数据分析案例-基于多元线性回归算法预测学生期末成绩
    【无标题】
    查看react-native版本和react版本 以及更新版本
    分类模型计算混淆矩阵
    【实用技巧】Unity中的Image组件
    Google Earth Engine(GEE)——Kmeans聚类快速进行土地分类(双for循环快速调参)
  • 原文地址:https://blog.csdn.net/weixin_42472027/article/details/134431958