Java问题定位与深度调试技术(四)——常用的问题定位工具

158 阅读5分钟

一、UNIX下的命令工具

/proc文件系统不是普通意义上的文件系统,它是一个到运行中进程地址空间的访问接口。/proc借助这些工具,可以对进程进行剖析,从而定位相关问题。

工具用法作用
pstackpstack [java pid]打印当前进程每个线程的调用堆栈。这里的线程堆栈是指本地线程堆栈,而非java线程堆栈。pstack命令对诊断进程的挂起或内存转储的状态非常有用。它默认显示进程中所有线程的堆栈情况,也可以作为一种原始的性能分析技巧,通过对进程堆栈的取样观察,可以确定进程把主要时间花在了哪些部分。
pfiles(Solaris) /lsof(linux)pfiles [java pid]列出该进程打开的所有文件和socket。借助该命令,找到泄露的文件或者socket就很容易缩小问题的方位了。如果是文件,可根据文件的名字找,如果是socket,就根据端口号找,这样很快就能确定是哪个功能模块造成的句柄泄露,然后检查相关的源代码,问题就能得到定位了
plddpldd [pid]列出本进程使用的动态库。如果程序中有JNI调用,就可以用该命令找到此进程到底调用了哪些动态库
pmappmap [pid]使用pmap命令可以显示组成进程内存空间的各个内存映射,也可以使用pmap查看进程占用物理内存(RSS)的大小并收集有关进程使用内存的更多信息。因为进程通过共享库的使用及其他共享内存映射的方式,与其他进程共享这些内存,可能会出现由于把同一共享内存统计多次而高估系统范围内的内存使用的状况。要缓解这种状况,可以把那些非共享的匿名内存数量当作进程独有内存使用的一个估计数(Anon列)。进程的内存分为以下两类。pmap -x可以看到哪个动态库分配了多少内存
ptreeptree [pid]显示与指定进程相关的父子关系
pwdxpwdx [pid]显示指定进程的运行目录
plimitplimit [pid]显示指定进程的限制

二、UNIX的进程统计工具prstat

进程统计工具(prstat)显示了一个正在使用系统资源进程的概要信息,prstat可以按一定的时间间隔统计信息,并打印到屏幕上。

image.png prstat默认用一列显示每个进程的输出,每项根据CPU消耗量进行排序,各列的含义如下。

  • PID:进程的 ID。
  • USERNAME:进程的所有者名称(用户名)。
  • SIZE:所有的映射虚拟内存大小,包括映射文件及设备。
  • RSS:驻留集合的大小。表示映射到进程的物理内存的总量,包括共享给其他进程的物理内存。进程的内存占用可以划分为两大类型:虚拟大小和驻留集合大小。虚拟大小是指进程占用虚拟内存的全部大小,即组成地址空间的单个映射虚拟大小的总和,进程虚拟内存的某些或全部是放在物理内存的,这个大小称为进程的驻留集合大小,即RSS。
  • STATE:进程状态。
  • PRI:进程优先级。
  • NICE:用于优先级计算的精确数字。
  • TIME;进程的累计执行时间。
  • CPU :CPU使用时间的百分比。
  • PROCESS/NLWP:进程名和进程的线程数。 另外,prstat还提供了另一个重要的选项:-L。使用-L选项,prstat显示每行是一个线程,而不是一个进程。示例如下。 00

image.png 在这里只有最后一列和上面的各列不同。

  • PROCESS/LWPID:进程名和对应的轻型进程ID(LWP)。这个选项对分析某些线程有帮助。

三、UNIX的剖析工具

工具用法
trusstruss:solaris跟踪本进程使用的操作系统调用和信号量,如truss-p 2343-v all1。strace : Linux跟踪本进程使用的操作系统调用和信号量。
straceLinux跟踪本进程使用的操作系统调用和信号量。
dtracesolaris10跟踪本进程使用的操作系统调用和信号量,其功能更强大。
sotrusssolaris跟踪共享库的系统调用,如sotruss date将列出date用到的所有动态库各自调用的系统调用。

四、路由跟踪命令

路由跟踪命令 traceroute/tracert显示路由到目的地址所经过的路由器,可以诊断网络阻塞。代码如下。

image.png

五、swap交换分区管理

交换分区在UNIX中非常重要,当系统莫名其妙出错时,交换分区就是可疑点之一。一般情况下,交换分区至少保证要有8G。在 Solaris 系统下,可以通过如下命令来增加交换分区。

image.png

六、文件类型与符号表

文件类型/符号表主要包括如下命令。

  • file core:检查core文件是由哪个进程产生的。
  • nm :查看ob、so等文件中的符号表,如果是C++则可以使用nm a.so |C++filt。

七、windows相关的工具

7.1 查看端口号被哪个进程占用

如下代码为查看80端口被占用的进程。

image.png

7.2 根据进程ID查询进程名称

如下代码为查询进程号“10640”的应用程序。

image.png

7.3 根据进程名称查询其运行期参数

如下代码为查询进程java.exe的运行参数。

image.png

7.4 结束进程

image.png