程序代码
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>HeapOOM</servlet-name>
<servlet-class>com.mem.HeapOOM</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HeapOOM</servlet-name>
<url-pattern>/servlet/HeapOOM</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
</web-app>
DeadLoop.java
package com.cpu;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
public class DeadLoop extends HttpServlet {
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException
{
try{
while(true){
Math.exp(Math.PI);
}
}
catch(Exception e){
while(true){
Math.exp(Math.PI);
}
}
}
}
查看cpu状态为剩余百分比为25.5%,使用kill -3 pid命令收集线程堆栈相关信息。
[weblogic@rh5 ~]$top top - 04:02:22 up 1 day, 5:00, 5 users, load average: 1.83, 1.28, 0.97 Tasks: 142 total, 3 running, 139 sleeping, 0 stopped, 0 zombie Cpu(s): 59.2%us, 14.7%sy, 0.0%ni, 25.5%id, 0.3%wa, 0.0%hi, 0.4%si, 0.0%st Mem: 2075424k total, 1785188k used, 290236k free, 183056k buffers Swap: 5144568k total, 0k used, 5144568k free, 795848k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9059 weblogic 18 0 786m 253m 19m S 34.1 12.5 28:30.90 java 9761 root 25 0 2552 1044 604 R 2.1 0.1 0:00.34 find 637 root 11 -5 0 0 0 S 0.1 0.0 0:02.45 kjournald 2770 root 15 0 1728 576 480 S 0.1 0.0 0:00.09 syslogd 7908 weblogic 20 0 811m 452m 25m S 0.1 22.3 2:27.79 java 9295 weblogic 15 0 2336 1052 800 R 0.1 0.1 0:00.12 top 9377 root 16 0 2412 956 836 S 0.1 0.0 0:00.01 run-parts 9743 root 18 0 2412 1000 836 S 0.1 0.0 0:00.01 makewhatis 1 root 25 0 2072 616 532 S 0.0 0.0 0:01.05 init 2 root RT -5 0 0 0 S 0.0 0.0 0:00.27 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 5 root RT -5 0 0 0 S 0.0 0.0 0:00.26 migration/1 6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1 7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1 |
使用命令top -H -p pid 收集占用进程中使用cpu较大的线程信息,得到占用cpu较大的的线程号9090 将得到的线程号转换为16进制 得到0x2382 [weblogic@rh5 ~]$ top -H -p 9059 top - 04:03:21 up 1 day, 5:01, 5 users, load average: 2.09, 1.37, 1.00 Tasks: 39 total, 2 running, 37 sleeping, 0 stopped, 0 zombie Cpu(s): 0.7%us, 0.1%sy, 0.0%ni, 99.2%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2075424k total, 1793520k used, 281904k free, 183104k buffers Swap: 5144568k total, 0k used, 5144568k free, 804436k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9090 weblogic 25 0 786m 253m 19m R 12.2 12.5 26:39.52 java 9075 weblogic 25 0 786m 253m 19m R 11.5 12.5 1:57.86 java 9059 weblogic 18 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9060 weblogic 16 0 786m 253m 19m S 0.0 12.5 0:02.57 java 9061 weblogic 18 0 786m 253m 19m S 0.0 12.5 0:00.06 java 9062 weblogic 16 0 786m 253m 19m S 0.0 12.5 0:00.06 java 9063 weblogic 17 0 786m 253m 19m S 0.0 12.5 0:00.06 java 9064 weblogic 17 0 786m 253m 19m S 0.0 12.5 0:00.04 java 9065 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.61 java 9066 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9067 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9068 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9069 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:02.71 java 9070 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:02.69 java 9071 weblogic 25 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9072 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.01 java 9073 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9074 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.01 java 9076 weblogic 18 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9077 weblogic 16 0 786m 253m 19m S 0.0 12.5 0:00.03 java 9078 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.17 java 9079 weblogic 24 0 786m 253m 19m S 0.0 12.5 0:00.06 java 9080 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.01 java 9081 weblogic 24 0 786m 253m 19m S 0.0 12.5 0:00.01 java 9082 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.01 java 9083 weblogic 19 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9085 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9086 weblogic 18 0 786m 253m 19m S 0.0 12.5 0:00.05 java 9087 weblogic 15 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9088 weblogic 17 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9089 weblogic 18 0 786m 253m 19m S 0.0 12.5 0:00.00 java 9092 weblogic 18 0 786m 253m 19m S 0.0 12.5 0:00.01 java 9093 weblogic 18 0 786m 253m 19m S 0.0 12.5 0:00.01 java |
通过得到的线程号在收集的线程堆栈中找到对应的“0x2382”,此时我们可以看到在nid=0x2382 线程出现“stuck” 查看报错信息可以看到“at com.cpu.DeadLoop.service(DeadLoop.java:19)” 通过报错信息对代码进行修改 "[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x890e0400 nid=0x2382 runnable [0x886fe000] java.lang.Thread.State: RUNNABLE at java.lang.StrictMath.exp(Native Method) at java.lang.Math.exp(Math.java:237) at com.cpu.DeadLoop.service(DeadLoop.java:19) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3732) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3696) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2273) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1490) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256) at weblogic.work.ExecuteThread.run(ExecuteThread.java:221) |