电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

在Java應(yīng)用程序中監(jiān)視CPU的使用

瀏覽:3日期:2024-06-19 11:00:40
內(nèi)容: 怎樣在Java中得到CPU的使用情況呢?這兒同時(shí)有一個(gè)好消息和一個(gè)壞消息。壞消息是不能使用純Java的方法得到CPU的使用。沒有這方面的直接的API。一個(gè)建議的替代方法是通過Runtime.exec()確定JVM的進(jìn)程ID(PID),調(diào)用外部的、平臺(tái)相關(guān)的命令,例如ps,然后在運(yùn)行結(jié)果中解析出感興趣的PID。但是,這種方法并不理想。 好消息是,可以采用一個(gè)更為可靠的方案:跳出Java,寫幾行C代碼,然后通過JNI進(jìn)行整合。下面我將向你展示編寫一個(gè)Win32平臺(tái)的簡單的JNI庫是多么簡單。 一般來說,JNI有點(diǎn)復(fù)雜。但是,如果你僅僅單向調(diào)用--從Java調(diào)用本地代碼,并且僅使用基本型進(jìn)行通訊--事情還是很簡單的。有許多JNI方面的學(xué)習(xí)資料,所以這兒我就不介紹JNI的基礎(chǔ)了。我僅介紹我的實(shí)現(xiàn)步驟。一、在Java中聲明JNI方法開始,我創(chuàng)建一個(gè)聲明了本地方法的類com.vladium.utils.SystemInformation,該方法返回當(dāng)前進(jìn)程已使用的CPU的毫秒數(shù)。public staticnative long getProcessCPUTime();使用JDK內(nèi)置的javah工具產(chǎn)生將來本地代碼實(shí)現(xiàn)使用的C頭。JNIEXPORT jlong JNICALLJava_com_vladium_utils_SystemInformation_getProcessCPUTime (JNIEnv * env, jclass cls)二、本地方法實(shí)現(xiàn)在大多數(shù)的Win32平臺(tái)上,該方法可以使用GetProcessTimes()系統(tǒng)調(diào)用實(shí)現(xiàn),差不多僅需要3行代碼就可以了:JNIEXPORT jlong JNICALLJava_com_vladium_utils_SystemInformation_getProcessCPUTime (JNIEnv * env, jclass cls){ FILETIME creationTime, exitTime, kernelTime, userTime; GetProcessTimes (s_currentProcess, & creationTime, & exitTime, & kernelTime, & userTime); return (jlong) ((fileTimeToInt64 (& kernelTime) + fileTimeToInt64 (& userTime)) / (s_numberOfProcessors * 10000));}該方法首先累加用于執(zhí)行當(dāng)前進(jìn)程的核心和用戶代碼耗費(fèi)的時(shí)間,除以處理器的數(shù)目,并把結(jié)果轉(zhuǎn)換到毫秒。fileTimeToInt64()是一個(gè)輔助函數(shù),用于把FILETIME結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換為64位的整數(shù)。s_currentProcess 和 s_numberOfProcessors是全局變量,當(dāng)JVM裝載本地庫時(shí)即初始化。static HANDLE s_currentProcess;static int s_numberOfProcessors;JNIEXPORT jint JNICALLJNI_OnLoad (JavaVM * vm, void * reserved){ SYSTEM_INFO systemInfo; s_currentProcess = GetCurrentProcess (); GetSystemInfo (& systemInfo); s_numberOfProcessors = systemInfo.dwNumberOfProcessors; return JNI_VERSION_1_2;}注意,如果你在UNIX平臺(tái)上實(shí)現(xiàn)getProcessCPUTime(),你應(yīng)該以getrusage系統(tǒng)調(diào)用開始。三、調(diào)用本地方法回到Java中,在SystemInformation類中,裝載本地庫(silib.dll on Win32)最好通過靜態(tài)初始化代碼塊完成。 private static final String SILIB = 'silib'; static { try { System.loadLibrary (SILIB); } catch (UnsatisfiedLinkError e) { System.out.println ('native lib '' + SILIB + '' not found in 'java.library.path': ' + System.getProperty ('java.library.path')); throw e; // re-throw } }注意,getProcessCPUTime()返回自JVM進(jìn)程創(chuàng)建以來使用的CPU時(shí)間。就這個(gè)數(shù)據(jù)本身而言,對(duì)于這兒并沒有太多的用處。我需要更有用的Java方法來記錄不同的時(shí)刻的數(shù)據(jù)快照(data snapshots),并報(bào)告任何兩個(gè)時(shí)間點(diǎn)之間CPU的使用。 public static final class CPUUsageSnapshot { private CPUUsageSnapshot (long time, long CPUTime) { m_time = time; m_CPUTime = CPUTime; } public final long m_time, m_CPUTime; } // end of nested class public static CPUUsageSnapshot makeCPUUsageSnapshot () { return new CPUUsageSnapshot (System.currentTimeMillis (), getProcessCPUTime ()); } public static double getProcessCPUUsage (CPUUsageSnapshot start, CPUUsageSnapshot end) { return ((double)(end.m_CPUTime - start.m_CPUTime)) / (end.m_time - start.m_time); }四、一個(gè)簡單的CPU監(jiān)視程序“CPU監(jiān)視API基本就完成了!最后,我創(chuàng)建了一個(gè)singleton的線程類CPUUsageThread,它自動(dòng)地每過一個(gè)時(shí)間間隔(默認(rèn)是0.5秒)就拍下一個(gè)數(shù)據(jù)快照,并報(bào)告給所有的CPU使用事件的監(jiān)聽者(Observer模式)。 public void run () { while (! isInterrupted ()) { final SystemInformation.CPUUsageSnapshot snapshot = SystemInformation.makeCPUUsageSnapshot (); notifyListeners (snapshot); try { sleep (sleepTime); } catch (InterruptedException e) { return; } } }CPUmon類是一個(gè)示例的監(jiān)聽器,僅簡單地把CPU的使用情況打印輸出到System.out。 public static void main (String [] args) throws Exception { if (args.length == 0) throw new IllegalArgumentException ('usage: CPUmon '); CPUUsageThread monitor = CPUUsageThread.getCPUThreadUsageThread (); CPUmon _this = new CPUmon (); Class app = Class.forName (args [0]); Method appmain = app.getMethod ('main', new Class [] {String[].class}); String [] appargs = new String [args.length - 1] System.arraycopy (args, 1, appargs, 0, appargs.length); monitor.addUsageEventListener (_this); monitor.start (); appmain.invoke (null, new Object [] {appargs}); }另外,為了能夠在啟動(dòng)要監(jiān)視的應(yīng)用程序之前開始CPUUsageThread,CPUmon.main()包裝了另一個(gè)Java主類。作為演示,我運(yùn)行CPUmon和JDK1.3.1的SwingSet2示例程序(不要忘了把silib.dll安裝到OS的PATH環(huán)境變量或者java.library.path系統(tǒng)屬性所覆蓋的路徑下):>java -Djava.library.path=. -cp silib.jar;(my JDK install dir)demojfcSwingSet2SwingSet2.jar CPUmon SwingSet2[PID: 339] CPU usage: 46.8%[PID: 339] CPU usage: 51.4%[PID: 339] CPU usage: 54.8%(while loading, the demo uses nearly 100% of one of the two CPUs on my machine)...[PID: 339] CPU usage: 46.8%[PID: 339] CPU usage: 0%[PID: 339] CPU usage: 0%(the demo finished loading all of its panels and is mostly idle)...[PID: 339] CPU usage: 100%[PID: 339] CPU usage: 98.4%[PID: 339] CPU usage: 97%(I switched to the ColorChooserDemo panel which ran a CPU-intensiveanimation that used both of my CPUs)...[PID: 339] CPU usage: 81.4%[PID: 339] CPU usage: 50%[PID: 339] CPU usage: 50%(I used Windows NT Task Manager to adjust the CPU affinity for the'java' process to use a single CPU)...當(dāng)然,我也可以通過任務(wù)管理器查看到CPU使用信息,這兒的要點(diǎn)是現(xiàn)在我們可以以編程方式記錄該信息。對(duì)于長時(shí)間運(yùn)行測(cè)試和服務(wù)器應(yīng)用診斷程序,遲早會(huì)派上用場(chǎng)。本文附帶的完整的庫中添加了其它一些有用的本地方法,其中一個(gè)可以得到進(jìn)程的PID(用于與外部工具整合)。from-javaworld.com javaresearch翻譯 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 冷库安装厂家_杭州冷库_保鲜库建设-浙江克冷制冷设备有限公司 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | FFU_空气初效|中效|高效过滤器_空调过滤网-广州梓净净化设备有限公司 | 超声骨密度仪-骨密度检测仪-经颅多普勒-tcd仪_南京科进实业有限公司 | 耐火浇注料价格-高强高铝-刚玉碳化硅耐磨浇注料厂家【直销】 | 砂磨机_立式纳米砂磨机_实验室砂磨机-广州儒佳化工设备厂家 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | 厂房出租_厂房出售_产业园区招商_工业地产 - 中工招商网 | 电动葫芦|手拉葫芦|环链电动葫芦|微型电动葫芦-北京市凌鹰起重机械有限公司 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 亿诺千企网-企业核心产品贸易 | 南方珠江-南方一线电缆-南方珠江科技电缆-南方珠江科技有限公司 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 杭州ROHS检测仪-XRF测试仪价格-百科 | 电力电子产业网 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | BAUER减速机|ROSSI-MERSEN熔断器-APTECH调压阀-上海爱泽工业设备有限公司 | 中红外QCL激光器-其他连续-半导体连续激光器-筱晓光子 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 盐城网络公司_盐城网站优化_盐城网站建设_盐城市启晨网络科技有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 挨踢网-大家的导航!| 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 地埋式垃圾站厂家【佳星环保】小区压缩垃圾中转站转运站 | 微型气泵-真空-蠕动-水泵-厂家-深圳市品亚科技有限公司 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 上海APP开发-APP制作-APP定制开发-上海APP开发制作公司-咏熠科技 |