Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断 线上程序运行问题。Arthas 官方文档十分详细,详见:https://alibaba.github.io/arthas

    Arthas使用
    # 下载arthas
    wget https://arthas.aliyun.com/arthas-boot.jar

    用java -jar运行即可,可以识别机器上所有Java进程(我们这里之前已经运行了一个Arthas测试程序,代码见下方)
    image.png

    1. package com.tuling.jvm;
    2. import java.util.HashSet;
    3. public class Arthas {
    4. private static HashSet hashSet = new HashSet();
    5. public static void main(String[] args) {
    6. // 模拟 CPU 过高
    7. cpuHigh();
    8. // 模拟线程死锁
    9. deadThread();
    10. // 不断的向 hashSet 集合增加数据
    11. addHashSetThread();
    12. }
    13. /**
    14. * 不断的向 hashSet 集合添加数据
    15. */
    16. public static void addHashSetThread() {
    17. // 初始化常量
    18. new Thread(() -> {
    19. int count = 0;
    20. while (true) {
    21. try {
    22. hashSet.add("count" + count);
    23. Thread.sleep(1000);
    24. count++;
    25. } catch (InterruptedException e) {
    26. e.printStackTrace();
    27. }
    28. }
    29. }).start();
    30. }
    31. public static void cpuHigh() {
    32. new Thread(() -> {
    33. while (true) {
    34. }
    35. }).start();
    36. }
    37. /**
    38. * 死锁
    39. */
    40. private static void deadThread() {
    41. /** 创建资源 */
    42. Object resourceA = new Object();
    43. Object resourceB = new Object();
    44. // 创建线程
    45. Thread threadA = new Thread(() -> {
    46. synchronized (resourceA) {
    47. System.out.println(Thread.currentThread() + " get ResourceA");
    48. try {
    49. Thread.sleep(1000);
    50. } catch (InterruptedException e) {
    51. e.printStackTrace();
    52. }
    53. System.out.println(Thread.currentThread() + "waiting get resourceB");
    54. synchronized (resourceB) {
    55. System.out.println(Thread.currentThread() + " get resourceB");
    56. }
    57. }
    58. });
    59. Thread threadB = new Thread(() -> {
    60. synchronized (resourceB) {
    61. System.out.println(Thread.currentThread() + " get ResourceB");
    62. try {
    63. Thread.sleep(1000);
    64. } catch (InterruptedException e) {
    65. e.printStackTrace();
    66. }
    67. System.out.println(Thread.currentThread() + "waiting get resourceA");
    68. synchronized (resourceA) {
    69. System.out.println(Thread.currentThread() + " get resourceA");
    70. }
    71. }
    72. });
    73. threadA.start();
    74. threadB.start();
    75. }
    76. }

    选择进程序号1,进入进程信息操作
    image.png
    输入dashboard可以查看整个进程的运行情况,线程、内存、GC、运行环境信息:
    image.png
    输入thread可以查看线程详细情况
    image.png
    输入 thread加上线程ID 可以查看线程堆栈
    image.png
    输入 thread -b 可以查看线程死锁
    image.png
    输入 jad加类的全名 可以反编译,这样可以方便我们查看线上代码是否是正确的版本
    image.png
    使用 ognl 命令可以查看线上系统变量的值,甚至可以修改变量的值
    image.png
    更多命令使用可以用help命令查看,或查看文档:https://alibaba.github.io/arthas/commands.html#arthas