Tomcat.exe正在消耗75%的CPU。
是否有人知道为什么会发生这种情况,以及如何降低CPU占用率?
我正在使用Tomcat5.5和J2SDK v 1.4.2_12。
我的日志里充满了Tomcat的日志。我将它们全部删除后,CPU使用率显著下降。
Lambda Probe 是一个非常方便的工具,用于监控Tomcat。
你使用的是四核CPU系统吗?可能Tomcat在其中3个核心上运行100%。我首先会测试应用程序中是否存在无限循环或类似问题。
首先(适用于所有Java应用程序),您必须确定使用CPU的线程。在JDK 1.6中,这是可能的。通过使用java.lang.management.ManagementFactory.getThreadMXBean()来实现。 以下是示例用法(JSP):
<%@ page import="java.lang.management.*, java.util.*" %>
<%!
Map cpuTimes = new HashMap();
Map cpuTimeFetch = new HashMap();
%><%
long cpus = Runtime.getRuntime().availableProcessors();
ThreadMXBean threads = ManagementFactory.getThreadMXBean();
long now = System.currentTimeMillis();
ThreadInfo[] t = threads.dumpAllThreads(false, false);
for (int i = 0; i < t.length; i++) {
long id = t[i].getThreadId();
Long idid = new Long(id);
long current = 0;
if (cpuTimes.get(idid) != null) {
long prev = ((Long) cpuTimes.get(idid)).longValue();
current = threads.getThreadCpuTime(t[i].getThreadId());
long catchTime = ((Long) cpuTimeFetch.get(idid)).longValue();
double percent = (current - prev) / ((now - catchTime) * cpus * 10000);
if (percent > 0 && prev > 0) {
out.println("<li>" + t[i].getThreadName() + " " + percent + " (" + prev + ", " + current + ")");
}
}
cpuTimes.put(idid, new Long(current));
cpuTimeFetch.put(idid, new Long(now));
}
%>
之后,您可以获取线程转储并分析该线程中的代码以解决CPU使用过多的问题。
<?xml version='1.0'?>
<Context
docBase="/opt/dspace/amaddev/dspace-6.3/webapps/jspui"
reloadable="true"
cachingAllowed="false"/>
<Host name="localhost" appBase="/opt/dspace/amaddev/dspace-6.3/webapps"
unpackWARs="true" autoDeploy="true">
-Xms -Xmx
。一旦我增加了JVM的内存分配,CPU利用率就大幅下降了。