我想問一下,是否有一些簡單的方法來確定java中每個線程的CPU使用情況。謝謝監控java中每個線程的CPU使用情況?
回答
雖然這是平臺依賴,我相信你要找的是ThreadMXBean:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.html。例如,您可以使用getThreadUserTime方法來獲取所需內容。要檢查您的平臺是否支持CPU測量,您可以調用isThreadCpuTimeSupported()。
相信JConsole(archived link)並通過插件
它採用ThreadMXBean getThreadCpuTime()函數提供這方面的信息。沿的線
東西:
long upTime = runtimeProxy.getUptime();
List<Long> threadCpuTime = new ArrayList<Long>();
for (int i = 0; i < threadIds.size(); i++) {
long threadId = threadIds.get(i);
if (threadId != -1) {
threadCpuTime.add(threadProxy.getThreadCpuTime(threadId));
} else {
threadCpuTime.add(0L);
}
}
int nCPUs = osProxy.getAvailableProcessors();
List<Float> cpuUsageList = new ArrayList<Float>();
if (prevUpTime > 0L && upTime > prevUpTime) {
// elapsedTime is in ms
long elapsedTime = upTime - prevUpTime;
for (int i = 0; i < threadIds.size(); i++) {
// elapsedCpu is in ns
long elapsedCpu = threadCpuTime.get(i) - prevThreadCpuTime.get(i);
// cpuUsage could go higher than 100% because elapsedTime
// and elapsedCpu are not fetched simultaneously. Limit to
// 99% to avoid Chart showing a scale from 0% to 200%.
float cpuUsage = Math.min(99F, elapsedCpu/(elapsedTime * 1000000F * nCPUs));
cpuUsageList.add(cpuUsage);
}
}
通過使用java.lang.management.ThreadMXBean。如何獲得ThreadMXBean的:
ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();
然後你就可以查詢多少特定線程是通過使用消耗:
long cpuTime = tmxb.getThreadCpuTime(aThreadID);
希望它能幫助。
的確,對象ThreadMXBean提供了您需要的功能(但它可能不會在所有虛擬機上實現)。
在JDK 1.5中,有一個演示程序正在執行您所需的操作。這是在文件夾演示/管理,它被稱爲JTop.java
不幸的是,它不是在Java6中。也許你可以在谷歌上找到或下載JDK5。
試試「TopThreads」JConsole插件。見http://lsd.luminis.nl/top-threads-plugin-for-jconsole/
鏈接已經爛掉,https://arnhem.luminis.eu/new_version_topthreads_jconsole_plugin/ – Joost 2017-07-13 09:18:57
Option_1:代碼級
在你的業務邏輯代碼;在開始時調用start()API和在finally塊中調用stop()。這樣你可以通過當前正在運行的線程獲得執行邏輯的CPU時間。然後記錄它。 Reference。
class CPUTimer
{
private long _startTime = 0l;
public void start()
{
_startTime = getCpuTimeInMillis();
}
public long stop()
{
long result = (getCpuTimeInMillis() - _startTime);
_startTime = 0l;
return result;
}
public boolean isRunning()
{
return _startTime != 0l;
}
/** thread CPU time in milliseconds. */
private long getCpuTimeInMillis()
{
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
return bean.isCurrentThreadCpuTimeSupported() ? bean.getCurrentThreadCpuTime()/1000000: 0L;
}
}
Option_2:使用插件監控級(不具有jvisualvm支持IBM AIX箱)
如果你認爲這是在現在添加代碼延遲,那麼你可以喜歡用的JConsole插件支持。我跟着this文章。那篇文章下載topthreads罐子和運行./jconsole -pluginpath topthreads-1.1.jar
Option_3:使用TOP(移動H)+監控級JSTACK(Unix機器具有 '希夫+ H' 的支持)
關注this教程, top命令將提供選項以查找最高CPU線程(nid)。在jstack輸出文件中檢查那個nid。
- 1. 如何監控linux多處理器環境中java應用程序的每個線程的CPU使用情況?
- 2. 監控每個線程的內存使用情況
- 3. 使用Python監控App Engine中的CPU使用情況
- 4. 監控進程的CPU和內存使用情況
- 5. 監控無線網絡使用情況
- 6. 在linux中的java服務器CPU使用情況監視器
- 7. 使用sysctl()的每個進程的iOS cpu使用情況?
- 8. CloudSql監控使用情況
- 9. 如何監控Android上CPU的使用情況?
- 10. 如何監控Java Heroku應用程序的dyno使用情況?
- 11. c#單線程獲取線程的CPU使用情況
- 12. 如何找出Java中的java進程的CPU使用情況
- 13. 從wmi獲取每個進程的CPU使用情況
- 14. 如何監控我的進程在Linux中的每個線程的內存使用情況?
- 15. 監控在單臺機器上運行的2個JVM的CPU使用情況
- 16. Java - 我如何監視其他進程的內存和CPU使用情況
- 17. 在Linux中查找線程的CPU使用情況
- 18. 使用WMI獲取C#中每個進程的CPU和RAM使用情況?
- 19. 如何使用Prometheus監控Mac上的nodejs cpu和內存使用情況?
- 20. 使用Java檢索窗口進程的CPU使用情況
- 21. 記錄特定進程每分鐘的CPU使用情況
- 22. 監控Android中進程的網絡使用情況
- 23. VB.NET:監控磁盤使用情況
- 24. 監控內存使用情況
- 25. JS監控數據使用情況?
- 26. Android監控網絡使用情況
- 27. 記錄Java應用程序的CPU使用情況
- 28. 線程的iOS和Mac CPU使用情況
- 29. 如何計算C中每個進程的平均CPU使用情況?
- 30. 在VBScript中可以確定每個進程的CPU使用情況嗎?
請注意,您可能還需要檢查您正在運行的JVM中是否啓用了CpuTime。 'threadBean_.isThreadCpuTimeEnabled()'將返回布爾值,如果不是'threadBean_.setThreadCpuTimeEnabled(true)',你可以隨時設置它。' – Graham 2012-07-06 07:37:22