Arthas对你的Java进程的 “提灯定损”,满满的“呵护”

127 阅读4分钟

常用命令

  1. trace

    • 作用: 跟踪指定方法的执行情况,输出方法内部调用路径及每个调用的耗时。
    • 用法: trace <class> <method> [-n <level>]
    • 示例: trace com.example.MyClass myMethod 追踪 com.example.MyClass 类的 myMethod 方法的调用情况。
  2. tt (Time Tunnel)

    • 作用: 记录指定方法的调用数据,并可以在稍后重放这些调用,查看方法的执行细节和耗时。
    • 用法: tt -t <class> <method>
    • 示例: tt -t com.example.MyClass myMethod 记录 com.example.MyClass 类的 myMethod 方法的调用。
  3. watch

    • 作用: 监视指定方法的调用,打印输入/输出参数及耗时。
    • 用法: watch <class> <method> [expression]
    • 示例: watch com.example.MyClass myMethod '{params, returnObj, cost}' 监视 com.example.MyClass 类的 myMethod 方法,并打印参数、返回值和耗时。
  4. profiler

    • 作用: 性能分析工具,能够对 JVM 的 CPU 使用情况进行取样分析。
    • 用法: profiler startprofiler stop
    • 示例: profiler start 开始 CPU 性能分析,profiler stop 停止分析并生成报告。
  5. dashboard

    • 作用: 显示当前系统和 JVM 的基本信息,包括 CPU、内存、GC 等。
    • 用法: dashboard
    • 示例: 直接输入 dashboard 可以查看当前系统状态。
  6. thread

    • 作用: 查看和管理 JVM 中的线程信息,可以查找死锁、阻塞等问题。
    • 用法: thread [id]thread -n <num>
    • 示例:
      • thread 显示所有线程信息。
      • thread 1 显示线程 ID 为 1 的详细信息。
      • thread -n 3 显示 CPU 使用率最高的前三个线程。
  7. jvm

    • 作用: 显示 JVM 的详细信息,如内存、GC、JIT 编译等。
    • 用法: jvm
    • 示例: 直接输入 jvm 可以查看 JVM 的详细信息。
  8. heapdump

    • 作用: 生成 JVM 的堆快照,用于分析内存问题。
    • 用法: heapdump [file]
    • 示例: heapdump /tmp/heapdump.hprof 将堆快照生成到指定文件。
  9. sc (Search Class)

    • 作用: 搜索 JVM 中已加载的类。
    • 用法: sc [-d] <class-name>
    • 示例:
      • sc com.example.MyClass 搜索名为 com.example.MyClass 的类。
      • sc -d com.example.MyClass 显示类的详细信息。
  10. sm (Search Method)

    • 作用: 搜索指定类的方法。
    • 用法: sm <class-name> [method-name]
    • 示例: sm com.example.MyClass 列出 com.example.MyClass 类的所有方法。
  11. ognl

    • 作用: 执行 OGNL 表达式,实时查看和修改运行时的对象状态。
    • 用法: ognl [expression]
    • 示例: ognl '@java.lang.System@out.println("Hello World")' 在控制台输出 "Hello World"。
  12. jad (Java Decompiler)

    • 作用: 反编译指定类,查看其源代码。
    • 用法: jad <class-name>
    • 示例: jad com.example.MyClass 反编译并显示 com.example.MyClass 的源代码。
  13. cls (Classloader Statistics)

    • 作用: 显示 JVM 中的类加载器统计信息。
    • 用法: cls
    • 示例: 直接输入 cls 查看类加载器统计信息。
  14. dump

    • 作用: 导出 JVM 中的类文件。
    • 用法: dump <class-name> [-d <directory>]
    • 示例:
      • dump com.example.MyClass 导出 com.example.MyClass 类文件。
      • dump com.example.MyClass -d /tmp 导出类文件到指定目录。

分析过程

  1. 确定需要分析的目标方法或代码块

    • 通过业务反馈、日志分析或用户报告,确定哪个方法或代码块可能存在性能问题。
  2. 使用 trace 命令

    • 对目标方法使用 trace 命令,观察方法调用的完整路径和每个子调用的耗时,找到具体耗时较长的调用。
    trace com.example.MyService processData
    
  3. 深入分析耗时调用

    • 如果 trace 命令显示某个子调用耗时较长,可以进一步使用 watch 命令监视这个子调用,获取详细的输入/输出参数和执行耗时。
    watch com.example.MyService processData '{params, returnObj, cost}'
    
  4. 使用 tt 命令记录和重放

    • 在生产环境中,通过 tt 命令记录耗时较长的方法调用,并在测试环境中重放,分析不同输入参数对性能的影响。
    tt -t com.example.MyService processData
    
  5. CPU 性能分析

    • 如果方法本身没有明显的耗时点,可以使用 profiler 命令对整个 JVM 进行 CPU 性能分析,查找是否存在 CPU 密集型操作或热点代码。
    profiler start
    # 运行一段时间后
    profiler stop
    
  6. 查看系统和 JVM 状态

    • 通过 dashboard 命令查看当前系统和 JVM 的基本信息。
    dashboard
    
  7. 检查线程状态

    • 使用 thread 命令查看和管理 JVM 中的线程信息。
    thread
    thread -n 5
    
  8. 检查 JVM 内存和 GC 情况

    • 通过 jvm 命令查看 JVM 内存和 GC 情况。
    jvm
    
  9. 生成堆快照进行内存分析

    • 使用 heapdump 命令生成 JVM 的堆快照。
    heapdump /tmp/heapdump.hprof
    
  10. 搜索和查看类和方法信息

    • 使用 scsm 命令搜索和查看类和方法的信息。
    sc com.example.MyClass
    sm com.example.MyClass
    
  11. 反编译类以检查其源代码

    • 使用 jad 命令反编译类,查看其源代码。
    jad com.example.MyClass
    
  12. 执行 OGNL 表达式修改对象状态

    • 使用 ognl 命令执行 OGNL 表达式,查看和修改对象状态。
    ognl '@java.lang.System@out.println("Testing OGNL")'
    
  13. 类加载器统计信息

    • 使用 cls 命令查看类加载器的统计信息。
    cls
    
  14. 导出类文件

    • 使用 dump 命令导出 JVM 中的类文件。
    dump com.example.MyClass -d /tmp