问题描述: cpu负载陡增,内存占用情况稳定。(在多cpu的情况下,比如4核,free 看到cpuload 15%,但是查看单cpu会达到 100% 负载。。。)
1分析工具jstack:
/usr/java/jdk1.6.0_13/bin/jstack -l 11831 > jstack.log // 进程 pid 号
以前 jstack 弄出来的栈文件总是不知道看些什么。通过这次问题的定位,发现 jstack 可以很快缩小排查范围。 比较适合定位线程相关的资源消耗。
核心看点:
1 检查活动状态的线程,查看提示行代码。如果不能找到问题,可以相隔几分钟从新 dump 一次,看该行是否重现。
2 在同一个 dump 文件多次出现同一个线程,提示同一行。往往会是“锁”。
2 . /usr/java/jdk1.6.0_13/bin/jmap -J-d64 -dump:live,format=b,file=heap_dump.bin 15605 // 进程 pid 号 , 文件名
dump 到的 bin 文件使用基于 eclipse 的工具“ MemoryAnalyzer ”,可以得到很完整的内存分析报告。
个人理解:仅仅是内存方面的分析,好像没办法分析 cpu 占用的东西。
3 . IDC 上,直接分析 java cpu 负载高的工具还不算多, jstack 只是说缩小排查范围,可能还需要下面这些技巧():
eclipse 的 profile 工具: http://eclipsecolorer.sourceforge.net/index_profiler.html
这个东东非常强大,可惜无法部署到 IDC 环境,也无法 dump 数据下来本机分析。对于可以在测试环境下重现的 cpu 负载高问题,可以尝试配置 profile 。
Strace http://hi.baidu.com/chinaw3/blog/item/4c5b772c39c485ee8a1399c2.html
strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。
strace 显示这些调用的参数并返回符号形式的值。 strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。
下面记录几个常用 option .
1 -f -F 选项告诉 strace 同时跟踪 fork 和 vfork 出来的进程
2 -o xxx.txt 输出到某个文件。
3 -e execve 只记录 execve 这类系统调用
这个命令的威力要自己试过了才知道。。嘿嘿
Java profile 参数: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf3.html
cpu=samples|times|old |
CPU usage |
off |
详细情况在“ Where the Application Spends its Time ”这个小节里面。 这个页面最后也顺带介绍了一下 strace 。