常用命令
-
trace
- 作用: 跟踪指定方法的执行情况,输出方法内部调用路径及每个调用的耗时。
- 用法:
trace <class> <method> [-n <level>] - 示例:
trace com.example.MyClass myMethod追踪com.example.MyClass类的myMethod方法的调用情况。
-
tt (Time Tunnel)
- 作用: 记录指定方法的调用数据,并可以在稍后重放这些调用,查看方法的执行细节和耗时。
- 用法:
tt -t <class> <method> - 示例:
tt -t com.example.MyClass myMethod记录com.example.MyClass类的myMethod方法的调用。
-
watch
- 作用: 监视指定方法的调用,打印输入/输出参数及耗时。
- 用法:
watch <class> <method> [expression] - 示例:
watch com.example.MyClass myMethod '{params, returnObj, cost}'监视com.example.MyClass类的myMethod方法,并打印参数、返回值和耗时。
-
profiler
- 作用: 性能分析工具,能够对 JVM 的 CPU 使用情况进行取样分析。
- 用法:
profiler start和profiler stop - 示例:
profiler start开始 CPU 性能分析,profiler stop停止分析并生成报告。
-
dashboard
- 作用: 显示当前系统和 JVM 的基本信息,包括 CPU、内存、GC 等。
- 用法:
dashboard - 示例: 直接输入
dashboard可以查看当前系统状态。
-
thread
- 作用: 查看和管理 JVM 中的线程信息,可以查找死锁、阻塞等问题。
- 用法:
thread [id]或thread -n <num> - 示例:
thread显示所有线程信息。thread 1显示线程 ID 为 1 的详细信息。thread -n 3显示 CPU 使用率最高的前三个线程。
-
jvm
- 作用: 显示 JVM 的详细信息,如内存、GC、JIT 编译等。
- 用法:
jvm - 示例: 直接输入
jvm可以查看 JVM 的详细信息。
-
heapdump
- 作用: 生成 JVM 的堆快照,用于分析内存问题。
- 用法:
heapdump [file] - 示例:
heapdump /tmp/heapdump.hprof将堆快照生成到指定文件。
-
sc (Search Class)
- 作用: 搜索 JVM 中已加载的类。
- 用法:
sc [-d] <class-name> - 示例:
sc com.example.MyClass搜索名为com.example.MyClass的类。sc -d com.example.MyClass显示类的详细信息。
-
sm (Search Method)
- 作用: 搜索指定类的方法。
- 用法:
sm <class-name> [method-name] - 示例:
sm com.example.MyClass列出com.example.MyClass类的所有方法。
-
ognl
- 作用: 执行 OGNL 表达式,实时查看和修改运行时的对象状态。
- 用法:
ognl [expression] - 示例:
ognl '@java.lang.System@out.println("Hello World")'在控制台输出 "Hello World"。
-
jad (Java Decompiler)
- 作用: 反编译指定类,查看其源代码。
- 用法:
jad <class-name> - 示例:
jad com.example.MyClass反编译并显示com.example.MyClass的源代码。
-
cls (Classloader Statistics)
- 作用: 显示 JVM 中的类加载器统计信息。
- 用法:
cls - 示例: 直接输入
cls查看类加载器统计信息。
-
dump
- 作用: 导出 JVM 中的类文件。
- 用法:
dump <class-name> [-d <directory>] - 示例:
dump com.example.MyClass导出com.example.MyClass类文件。dump com.example.MyClass -d /tmp导出类文件到指定目录。
分析过程
-
确定需要分析的目标方法或代码块
- 通过业务反馈、日志分析或用户报告,确定哪个方法或代码块可能存在性能问题。
-
使用 trace 命令
- 对目标方法使用
trace命令,观察方法调用的完整路径和每个子调用的耗时,找到具体耗时较长的调用。
trace com.example.MyService processData - 对目标方法使用
-
深入分析耗时调用
- 如果
trace命令显示某个子调用耗时较长,可以进一步使用watch命令监视这个子调用,获取详细的输入/输出参数和执行耗时。
watch com.example.MyService processData '{params, returnObj, cost}' - 如果
-
使用 tt 命令记录和重放
- 在生产环境中,通过
tt命令记录耗时较长的方法调用,并在测试环境中重放,分析不同输入参数对性能的影响。
tt -t com.example.MyService processData - 在生产环境中,通过
-
CPU 性能分析
- 如果方法本身没有明显的耗时点,可以使用
profiler命令对整个 JVM 进行 CPU 性能分析,查找是否存在 CPU 密集型操作或热点代码。
profiler start # 运行一段时间后 profiler stop - 如果方法本身没有明显的耗时点,可以使用
-
查看系统和 JVM 状态
- 通过
dashboard命令查看当前系统和 JVM 的基本信息。
dashboard - 通过
-
检查线程状态
- 使用
thread命令查看和管理 JVM 中的线程信息。
thread thread -n 5 - 使用
-
检查 JVM 内存和 GC 情况
- 通过
jvm命令查看 JVM 内存和 GC 情况。
jvm - 通过
-
生成堆快照进行内存分析
- 使用
heapdump命令生成 JVM 的堆快照。
heapdump /tmp/heapdump.hprof - 使用
-
搜索和查看类和方法信息
- 使用
sc和sm命令搜索和查看类和方法的信息。
sc com.example.MyClass sm com.example.MyClass - 使用
-
反编译类以检查其源代码
- 使用
jad命令反编译类,查看其源代码。
jad com.example.MyClass - 使用
-
执行 OGNL 表达式修改对象状态
- 使用
ognl命令执行 OGNL 表达式,查看和修改对象状态。
ognl '@java.lang.System@out.println("Testing OGNL")' - 使用
-
类加载器统计信息
- 使用
cls命令查看类加载器的统计信息。
cls - 使用
-
导出类文件
- 使用
dump命令导出 JVM 中的类文件。
dump com.example.MyClass -d /tmp - 使用