分析方法:
自上而下。从应用的顶层,逐步深入到具体的不同模块,或者更近一步的技术细节单元,找到可能的问题和解决办法。这是最常见的性能分析思路,也是大多数工程师的选择。
自下而上。从类似 CPU 这种硬件底层,判断类似Cache-Miss之类的问题和调优机会,出发点是指令级别优化。这往往是专业的性能工程师才能掌握的技能,并且需要专业工具配合,大多数是移植到新的平台上,或需要提供极致性能时才会进行。
系统性能分析中,CPU、内存和 IO 是主要关注项。
怎么找到最耗费 CPU 的 Java 线程,简要介绍步骤:
1)top 命令获取相应 pid,“-H”代表 thread 模式,你可以配合 grep 命令更精准定位。
2)然后转换成为 16 进制。printf "%x" your_pid
3)最后利用 jstack 获取的线程栈,对比相应的 ID 即可。利用 vmstat 之类,查看上下文切换的数量vmstat -1 -10
如果每秒上下文切换列(cs,context switch)很高,并且比系统中断列(in,system interrupt)高很多,就表明很有可能是因为不合理的多线程调度所导致。
找繁忙线程时,top -h , 再jstack, 再换算tid比较累,而且jstack会造成停顿。推荐用vjtools里的vjtop, 不断显示繁忙的javaj线程,不造成停顿。
内存使用情况:利用 free 之类查看内存使用。
磁盘: iostat 等命令有助于判断磁盘的健康状况
JVM 层面的性能分析,我们已经介绍过非常多了:
利用 JMC、JConsole 等工具进行运行时监控。
利用各种工具,在运行时进行堆转储分析,或者获取各种角度的统计数据(如jstat -gcutil 分析 GC、内存分带等)。
GC 日志等手段,诊断 Full GC、Minor GC,或者引用堆积等。