在工做當中,確定會遇到由代碼所致使的高CPU耗用以及內存溢出的狀況。這種狀況發生時,咱們怎麼去找出緣由並解決。java
通常解決方法是經過top命令找出消耗資源高的線程id,利用strace命令查看該線程全部系統調用apache
1.經過top命令查看當前系統CPU使用狀況,找到可疑進程PIDspa
top - 09:37:18 up 70 days, 16:29, 2 users, load average: 1.13, 1.04, 0.97 Tasks: 105 total, 1 running, 104 sleeping, 0 stopped, 0 zombie Cpu(s): 1.0%us, 4.9%sy, 0.0%ni, 93.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.5%st Mem: 2067816k total, 1756680k used, 311136k free, 236340k buffers Swap: 524284k total, 255508k used, 268776k free, 277040k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24138 apache 20 0 1273m 384m 3668 S 103.3 19.0 1232:39 java 3359 root 39 19 2704 36 0 S 0.3 0.0 4:39.34 gam_server 6696 root 20 0 34148 1604 244 S 0.3 0.1 5:06.63 httpd 19254 root 20 0 785m 221m 3176 S 0.3 11.0 9:04.36 java 1 root 20 0 2224 28 0 S 0.0 0.0 1:22.46 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:33.42 ksoftirqd/0 5 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kworker/u:0
從上面命令中能夠看出java進程CPU利用率一直保持100%,穩居不下,找到PID 24138線程
2. 找出消耗資源最高的線程code
top -H -p 24138 能夠不用第一步,直接執行命令 top -H ,就能夠查看到消耗資源最高的線程server
top - 09:49:49 up 70 days, 16:41, 2 users, load average: 1.01, 1.04, 1.00 Tasks: 72 total, 1 running, 71 sleeping, 0 stopped, 0 zombie Cpu(s): 0.6%us, 1.3%sy, 0.0%ni, 97.7%id, 0.1%wa, 0.0%hi, 0.0%si, 0.2%st Mem: 2067816k total, 1760840k used, 306976k free, 236744k buffers Swap: 524284k total, 253344k used, 270940k free, 279092k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24167 apache 20 0 1273m 384m 3688 R 99.1 19.0 1169:43 java 24152 apache 20 0 1273m 384m 3688 S 2.0 19.0 0:28.58 java 24188 apache 20 0 1273m 384m 3688 S 2.0 19.0 4:56.69 java 24138 apache 20 0 1273m 384m 3688 S 0.0 19.0 0:00.00 java
3. 查看這個線程全部系統調用狀況blog
strace -p 24167
4. 將須要的線程ID轉換爲16進制格式進程
printf "%x\n" 24167 73ef
5. 最後打印線程的堆棧信息:內存
jstack 24167|grep 73ef -A 30
六、也可抓取堆棧信息,查看代碼位置資源
jstack -F 24167 > dump.txt
經過這幾步基本能夠找出什麼緣由致使java進程佔用那麼高CPU資源。