1、首先dump出該進程的所有線程及狀態

創新互聯公司堅信:善待客戶,將會成為終身客戶。我們能堅持多年,是因為我們一直可值得信賴。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。10年網站建設經驗創新互聯公司是成都老牌網站營銷服務商,為您提供成都網站制作、網站設計、外貿網站建設、網站設計、html5、網站制作、品牌網站建設、成都微信小程序服務,給眾多知名企業提供過好品質的建站服務。
使用命令 jstack PID 命令打印出CPU占用過高進程的線程棧.
jstack -l56835683.stack
將進程id為5683的線程棧輸出到了文件
2、使用top命令找到耗cpu的線程
使用top -H -p PID 命令查看對應進程是哪個線程占用CPU過高.
1、確定當前系統安裝的jdk是1.6版本以上
2、windows系統中有獲取cpu使用率的可執行文件exe,只要在java中獲取該文件的執行路徑,通過Java調用即可。
3、獲取操作系統可執行文件目錄procCmd
4、調用java的Runtime.getRuntime().exec執行cmd應用程序
5、利用java中sleep來計算睡眠前后cpu的忙碌時間與空閑時間,因為sleep不會釋放系統資源
6、根據忙碌時間占總時間的比例來計算cpu使用率
示例:
private?double?getCpuRatioForWindows()?{??
try?{??
String?procCmd?=?System.getenv("windir")??
+?"http://system32//wbem//wmic.exe?process?get?Caption,CommandLine,"??
+?"KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";??
//?取進程信息??
long[]?c0?=?readCpu(Runtime.getRuntime().exec(procCmd));??
Thread.sleep(CPUTIME);??
long[]?c1?=?readCpu(Runtime.getRuntime().exec(procCmd));??
if?(c0?!=?null??c1?!=?null)?{??
long?idletime?=?c1[0]?-?c0[0];??
long?busytime?=?c1[1]?-?c0[1];??
return?Double.valueOf(??
PERCENT?*?(busytime)?/?(busytime?+?idletime))??
.doubleValue();??
}?else?{??
return?0.0;??
}??
}?catch?(Exception?ex)?{??
ex.printStackTrace();??
return?0.0;??
}??
}
一般一個cpu核心可以搭載兩個線程,你根據核心去搭載線程,不要亂放線程。
還有你有10個線程同時跑耗時操作最少也要4核的cpu,你可以減少線程或者減少線程中的耗時操作。
如果你是解碼或者壓縮程序的話那么cpu100%也很正常,如果是socket網絡連接你可以看看windows iocp,linux epoll的實現。
Java的System.currentTimeMillis()方法可以嘗試,思路為計算后時間的時間減去計算前的時間,只能說是盡量接進CPU的計算時間
示例如下:
import?java.text.SimpleDateFormat;
import?java.util.Date;
public?class?A{
public?static?void?main(String[]?args)?throws?Exception?{
long?s?=?System.currentTimeMillis();
for?(int?i?=?0;?i??5;?i++)?{
Thread.sleep(5);
}
long?e?=?System.currentTimeMillis();
System.out.println("耗時時間為"?+?(e?-?s)?+?"毫秒");
}
}
第一步:先找出java的進程Id(PID) 假設java應用名稱是zcg_commodity
ps -ef|grep zcg_commodity
得到進程Id為32464
第二步:找出該進程內最消耗CPU的線程
top -Hp pid
輸入top -Hp 32464
TIME列就是各個java線程耗費的CPU的時間,比如圖中是線程ID的為2012的線程,
通過 printf “%x\n” 2012
得到2012的十六進制為 7dc
第三步:
一般會進到jdk的bin目錄下,root權限執行
jstack 32464|grep 7dc
首先有個基本問題需要了解一下:
這里所說java里獲得一個進程的內存使用情況和cpu運行時間,是指在java內部獲取一個純外部進程的內存與cpu時間呢,還是指在java內部,由java啟動的進程的內存與cpu時間。
如果是第一種情況,那你還需要在java內部再起一個進程,通過執行操作系統的shell命令來查看那個進程的運行狀態。比如那個外部進程的ID為3119,則執行cat /proc/3119/status | grep VmRSS就可以過濾出該進程的物理內存占用量。
如果是第二種情況,(假定你問的就是這種情況)。
先說內存占用量:一般說來,你可以使用這兩種方式獲取內存使用情況
方式一:
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage(); //椎內存使用情況
long totalMemorySize = memoryUsage.getInit(); //初始的總內存
long maxMemorySize = memoryUsage.getMax(); //最大可用內存
long usedMemorySize = memoryUsage.getUsed(); //已使用的內存
方式二:
Runtime rt = Runtime.getRuntime();
long totalMemorySize = rt.totalMemory(); //初始的總內存
long maxMemorySiz = t.maxMemory(); //最大可用內存
long freeMemorySize = rt.freeMemory(); //當前可用內存
需要說明的是,這種方式獲取的是整個jvm的內存使用情況,并不是某一個進程的內存使用情況,事實上,在java內部,可以使用Rumtime.getRuntime().exec(${SHELL})來開啟一個外部進程(這里${SHELL}代表一個可操作系統的shell命令)。而運行Java程序整個jvm,對于操作系統而言,也僅僅只是一個進程。也就是說,一個jvm就是一個進程,你通過java程序開啟的進程都是外部進程,java內部目前還提供了一個destroy方法來銷毀該進程,對于該進程的其它信息,都無法直接獲取,這些信息的獲取,顯然需要本地化(Local)的實現。既然標準jdk庫沒有,就不可能再通過平臺無關的代碼來實現了。典型的做法就是使用前面第一種情況的方式,再啟一個進程,執行shell命令來獲取。
不過對于cpu使用時間,采用標準java代碼倒是可以拿到。由于java的語法很啰嗦,舉一個較完全的例子需要太多的代碼,我這里就只寫最關鍵的代碼:
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
① long currentCpuTime = threadMXBean.getCurrentThreadCpuTime(); //當前線程的cpu使用時間
long someThreadId = 709817L; //假定有某個線程的ID是709817
② long someThreadCpuTime = threadMXBean.getThreadCpuTime(someThreadId); //獲取ID為someThreadId即709817的線程的cpu時間
基于上面的核心api,你可以把由java啟動的外部進程放到一個單獨的線程中執行,再用代碼②的方式來獲取該進程的cpu使用時間,也可以將外部進程放入到當前線程中執行,用① 的方式來獲得進程的cpu使用時間。
網站名稱:javacpu耗時代碼,java 計算耗時
本文路徑:http://www.js-pz168.com/article48/hcesep.html
成都網站建設公司_創新互聯,為您提供定制開發、企業網站制作、企業建站、服務器托管、全網營銷推廣、虛擬主機
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯