知道了关于Linux进程的一点事儿

昨天在乐维参与这两个问题的回答:

搜索过程中也解答了自己对Linux系统进程号一直以来存在的疑问,也加深了对僵尸进程和孤儿进程的理解。帮助别人的同时自己也有收获,这就是知识交流的好处,也是这种社交问答网站的价值所在吧。

关于进程号:

  • 32位系统的最大进程号是32,767,当到达32,768时系统会重新开始计数并从头寻找可用的值给新进程
  • 64位系统的最大进程号是 222 - 1 = 4,194,303
  • /proc/sys/kernel/pid_max 保存了这个上限。32位和64位系统的默认值都是32,768。

搜索到的两篇文章:

  • http://www.refining-linux.org/archives/7/Dr.-Frankenlinux-or-how-to-create-zombie-processes/
  • http://www.geekride.com/orphan-zombie-process/

使用Eclipse Memory Analyzer(MAT)解决Java Web应用故障

这周一我负责维护的一个系统突然出现故障,用户反映系统很慢,浏览器加载半天最后进了错误页面。登录到系统查看,发现系统负载很高,用sar命令进一步明确了是java进程在某一时刻后突然占据了大量CPU资源。查看应用日志,发现了OutOfMemory异常,然后使用jstat的gcutil确认JVM heap工作不正常,已经有上千次的full gc了。

用VisualGC或者jmap工具生成Headp dump文件,然后用MAT打开,生成内存泄露的分析报告,查找占用内存最大的对象并通过Thread call stack就可以定位导致问题出现的类和方法。

由于系统属旧系统,代码一直没有改动,显然是数据出了问题。最终发现是用户输入的格式不规范的数据,使得对数据做查找替换的一段代码不断地扩大1个字符串对象,导致内存消耗不断增长,gc频繁。


# sar
# sar -P ALL 1 5
# jstat -gcutil 1000
# jmap -dump:format=b,file=HeapDump.hprof

参考: http://wiki.eclipse.org/index.php/MemoryAnalyzer