bug 调试

系统性能分析中,CPU、内存和 IO 是主要关注项。----系统层面

1. 对于 CPU,如果是常见的 Linux,可以先用 top 命令查看负载状况。 top -H  -p [pid]

 pstree -p [pid]  

2.  利用 free 之类查看内存使用。

3. 对于 IO 问题,既可能发生在磁盘 IO,也可能是网络 IO。 iostat, netstat 。

对于JVM 层面的性能分析-----JVM层面

利用各种工具,在运行时进行堆转储分析。如jstat,jstack,vmstat  获取各种角度的统计数据(如jstat -gcutil 分析GC、内存分带等)。

1. 利用 jstat 等工具,获取内存使用的统计信息也是个常用手段。

2. 利用 jstack 等工具检查是否出现死锁等

利用 jstack 获取的线程栈,对比相应的 ID 即可。 注意将pid转成16进制后,在到jstack的输出log里去查找。

还有更加通用的诊断方向,利用 vmstat 之类,查看上下文切换频率。如果每秒上下文(cs,context switch)切换很高,并且比系统中断高很多,就表明很有可能是因为不合理的多线程调度所导致。

3. 应用进行 Profiling 也是个办法,但因为它会对系统产生侵入性,大多数情况下并不建议在生产系统进行。建议使用 JFR 配合JMC来做 Profiling,因为它是从 Hotspot JVM 内部收集底层信息。

它的使用也非常方便,你不需要重新启动系统或者提前增加配置,你可以在运行时启动 JFR 记录,并将这段时间的信息写入文件。

      Jcmd JFR.start duration=120s filename=myrecording.jfr  

       然后,使用 JMC 打开“.jfr 文件”就可以进行分析了,方法、异常、线程、IO 等应有尽有,其功能应有尽有,非常强大。

4  利用 JMC、JConsole 等工具进行运行时监控。

补充:

1. dstat命令是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具

2。 profiling收集程序运行时信息的方式主要有以下三种:
事件方法:对于 Java,可以采用 JVMTI(JVM Tools Interface)API 来捕捉诸如方法调用、类载入、类卸载、进入 / 离开线程等事件,然后基于这些事件进行程序行为的分析。
统计抽样方法(sampling): 该方法每隔一段时间调用系统中断,然后收集当前的调用栈(call stack)信息,记录调用栈中出现的函数及这些函数的调用结构,基于这些信息得到函数的调用关系图及每个函数的 CPU 使用信息。由于调用栈的信息是每隔一段时间来获取的,因此不是非常精确的,但由于该方法对目标程序的干涉比较少,目标程序的运行速度几乎不受影响。
植入附加指令方法(BCI): 该方法在目标程序中插入指令代码,这些指令代码将记录 profiling 所需的信息,包括运行时间、计数器的值等,从而给出一个较为精确的内存使用情况、函数调用关系及函数的 CPU 使用信息。该方法对程序执行速度会有一定的影响,因此给出的程序执行时间有可能不准确。但是该方法在统计程序的运行轨迹方面有一定的优势。

原文地址:https://www.cnblogs.com/wfq9330/p/9488508.html