回答
要理解發生了什麼,您應該嘗試在探查器下運行它。試試YourKit(http://www.yourkit.com/)或Netbeans(http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html)。
YourKit一個與tomcat更好的整合。
這很可能是由你在tomcat的頂部運行的應用程序(一個或多個)引起的。當然,如果你的應用程序流量很高,這也可能是原因。
如果你使用75%的CPU,並不明白爲什麼,我建議你發一個殺死-3的tomcat進程(ctrl-break,如果你有一個控制檯)來獲得線程轉儲(當負載很高!)。根據我的經驗,大多數線程應該閒置或等待。尋找在堆棧跟蹤中重複出現的任何單一代碼分支,這是您可能的罪魁禍首(非IO等待!)。這是「窮人的剖析器」,通常是解決這些問題的最佳和最有效的方法。
如果你想保存輸出的文件,你可以使用jstack命令:jstack
所有的答案都涵蓋了如何做一個確切的診斷,另外我會補充一點,根據我的經驗,在你的應用程序中的一個無限循環可能是罪魁禍首。
正如J-16 SDiZ所說,您最好的選擇是運行探查器將問題縮小到一個應用程序。
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使用率過高。
我的日誌中充滿了Tomcat日誌。我刪除了所有這些,CPU使用率大幅下降。
- 1. 調整Tomcat內存和CPU消耗
- 2. Tomcat的消耗非常高的CPU使用率
- 3. 我的應用程序消耗高CPU
- 4. BizTalk 2013 R2 CPU消耗非常高
- 5. 後臺進程不斷消耗高CPU
- 6. AVAudioPlayer CPU消耗95%?
- 7. clr.sll!StrongNameSignatureVerification CPU消耗
- 8. ElasticSearch消耗100%CPU
- 9. 在EC2上的RabbitMQ消耗CPU的CPU
- 10. Hung JVM消耗100%CPU
- 11. rmi.transport.tcp.tcptransport Connectionhandler消耗很多CPU
- 12. Java定時器消耗CPU
- 13. Tomcat扣動並消耗所有可用的CPU
- 14. http請求正文解析導致高CPU消耗
- 15. 使用php的高CPU消耗的Mysql請求
- 16. 使用boost :: asio時的高CPU和內存消耗async_read_some
- 17. JAX-WS線程消耗%100 CPU
- 18. 內存不足,CPU消耗低
- 19. Android - CPU使用率和電量消耗
- 20. 測量CPU /存儲器消耗
- 21. Elastic Beanstalk Ruby進程消耗CPU
- 22. apache spark過程的CPU消耗
- 23. 我的進程的CPU消耗
- 24. 跟蹤線程內存和CPU消耗
- 25. DLL消耗100%的CPU使用率
- 26. 測量進程消耗的CPU時鐘
- 27. Python消耗CPU運行eventlet的99%
- 28. 硬盤掃描的CPU消耗等效
- 29. RDS MySQL高內存消耗
- 30. 如果tomcat作爲Windows服務託管,tomcat8.exe會消耗大量CPU /內存
當我重新啓動Tomcat服務器時,其服務器位於10-15%,我開始使用應用程序'A',一旦它的使用率超過5-6倍CPU停止60-70%並且永遠不會降低。然後我需要重新啓動服務器。同樣的應用程序正在運行在生產框,它不會產生問題,但在UAT框中它是... – Miral 2009-04-23 08:27:34