亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

在Java應用程序中監視CPU的使用

2019-11-18 13:15:03
字體:
來源:轉載
供稿:網友

  怎樣在java中得到CPU的使用情況呢?這兒同時有一個好消息和一個壞消息。壞消息是不能使用純Java的方法得到CPU的使用。沒有這方面的直接的API。一個建議的替代方法是通過Runtime.exec()確定JVM的進程ID(PID),調用外部的、平臺相關的命令,例如ps,然后在運行結果中解析出感愛好的PID。但是,這種方法并不理想。
  
  可以采用一個更為可靠的方案:跳出Java,寫幾行C代碼,然后通過JNI進行整合。下面我將向你展示編寫一個Win32平臺的簡單的JNI庫是多么簡單。
  
  一般來說,JNI有點復雜。但是,假如你僅僅單向調用--從Java調用本地代碼,并且僅使用基本型進行通訊--事情還是很簡單的。有許多JNI方面的學習資料,所以這兒我就不介紹JNI的基礎了。我僅介紹我的實現步驟。
  
  一、在Java中聲明JNI方法
  開始,我創建一個聲明了本地方法的類com.vladium.utils.SystemInformation,該方法返回當前進程已使用的CPU的毫秒數。
  
  public staticnative long getPRocessCPUTime();
  
  使用JDK內置的javah工具產生將來本地代碼實現使用的C頭。
  
  JNIEXPORT jlong JNICALLJava_com_vladium_utils_SystemInformation_getProcessCPUTime (JNIEnv * env, jclass cls)
  
  二、本地方法實現
  在大多數的Win32平臺上,該方法可以使用GetProcessTimes()系統調用實現,差不多僅需要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));}
  
  該方法首先累加用于執行當前進程的核心和用戶代碼耗費的時間,除以處理器的數目,并把結果轉換到毫秒。fileTimeToInt64()是一個輔助函數,用于把FILETIME結構的數據轉換為64位的整數。s_currentProcess 和 s_numberOfProcessors是全局變量,當JVM裝載本地庫時即初始化。
  
  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平臺上實現getProcessCPUTime(),你應該以getrusage系統調用開始。
  
  三、調用本地方法
  回到Java中,在SystemInformation類中,裝載本地庫(silib.dll on Win32)最好通過靜態初始化代碼塊完成。
  
  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進程創建以來使用的CPU時間。就這個數據本身而言,對于這兒并沒有太多的用處。我需要更有用的Java方法來記錄不同的時刻的數據快照(data snapshots),并報告任何兩個時間點之間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);
    }
  
  四、一個簡單的CPU監視程序
  “CPU監視API”基本就完成了!最后,我創建了一個singleton的線程類CPUUsageThread,它自動地每過一個時間間隔(默認是0.5秒)就拍下一個數據快照,并報告給所有的CPU使用事件的監聽者(Observer模式)。
  
  public void run ()  {
  while (! isInterrupted ())    {
  final SystemInformation.CPUUsageSnapshot snapshot  = SystemInformation.makeCPUUsageSnapshot ();      notifyListeners (snapshot);
  try      {
  sleep (sleepTime);      }
  catch (InterruptedException e)      {        return;      }    }  }
  
  CPUmon類是一個示例的監聽器,僅簡單地把CPU的使用情況打印輸出到System.out。
  
  [code]  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});  }[/code]
  
  另外,為了能夠在啟動要監視的應用程序之前開始CPUUsageThread,CPUmon.main()包裝了另一個Java主類。
  作為演示,我運行CPUmon和JDK1.3.1的SwingSet2示例程序(不要忘了把silib.dll安裝到OS的PATH環境變量或者java.library.path系統屬性所覆蓋的路徑下):
  
  >java -Djava.library.path=. -cp silib.jar;(my JDK install dir)/demo/jfc/SwingSet2/SwingSet2.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-intensive
  animation 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)
  ...
  
  當然,我也可以通過任務治理器查看到CPU使用信息,這兒的要點是現在我們可以以編程方式記錄該信息。對于長時間運行測試和服務器應用診斷程序,遲早會派上用場。本文附帶的完整的庫中添加了其它一些有用的本地方法,其中一個可以得到進程的PID(用于與外部工具整合)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久国产精品视频| 一区二区三区黄色| 亚洲最大成人在线| 欧美日韩国产一区中文午夜| 4438全国亚洲精品在线观看视频| 日韩成人在线播放| 5566日本婷婷色中文字幕97| 国产精品自拍偷拍视频| 国产精品白丝jk喷水视频一区| 精品少妇一区二区30p| 亚洲成av人片在线观看香蕉| 疯狂做受xxxx高潮欧美日本| 在线播放日韩欧美| xxav国产精品美女主播| 亚洲视频在线免费看| 国产精品久久久久久久久久| 操人视频在线观看欧美| 国产日韩精品一区二区| 欧美激情亚洲综合一区| 97视频色精品| 亚洲专区中文字幕| 亚洲自拍在线观看| 91精品国产综合久久香蕉922| 亚洲精品美女在线观看播放| 日韩经典一区二区三区| 欧美极品在线视频| 中文字幕亚洲国产| 一区二区欧美亚洲| 色噜噜狠狠色综合网图区| 欧美视频免费在线观看| 亚洲理论在线a中文字幕| 精品亚洲夜色av98在线观看| 日韩有码片在线观看| 欧美老女人xx| 亚洲成人久久久| 色综合久久88| 日韩欧美一区二区三区久久| 国产精品都在这里| 成人午夜小视频| 欧美日韩国产在线看| 欧美高清视频一区二区| 国产精品色婷婷视频| 欧美精品亚州精品| 亚洲色图激情小说| 精品高清美女精品国产区| 国产啪精品视频| 欧美高清视频在线观看| 日韩中文字幕在线观看| 富二代精品短视频| 91美女福利视频高清| 日韩的一区二区| 精品国产1区2区| 一区二区亚洲欧洲国产日韩| 96sao精品视频在线观看| 深夜精品寂寞黄网站在线观看| 国产精品久久久久久中文字| 欧美精品激情在线| 91在线无精精品一区二区| 国模私拍一区二区三区| 久久精品国产91精品亚洲| 久久99国产精品自在自在app| 日韩国产中文字幕| 国产亚洲日本欧美韩国| 欧美精品做受xxx性少妇| 欧美性xxxx极品高清hd直播| 国产精品视频yy9099| 亚洲欧美日本伦理| 日本精品久久中文字幕佐佐木| 欧美裸体xxxx| 亚洲欧洲黄色网| 国产剧情久久久久久| 91久久久亚洲精品| 亚洲国产天堂久久综合网| 在线看福利67194| 性色av一区二区三区在线观看| 亚洲国产成人一区| 中文字幕亚洲色图| 亚洲精品永久免费精品| 色综合五月天导航| 不卡av在线网站| 成人有码在线视频| 一本一道久久a久久精品逆3p| 精品免费在线视频| 韩国精品久久久999| 国产欧美亚洲精品| 成人欧美一区二区三区黑人孕妇| 久久久视频免费观看| 亚洲精品影视在线观看| 色偷偷91综合久久噜噜| 亚洲精品成人久久| 成人午夜两性视频| 国产精品99久久久久久久久| 亚洲综合日韩中文字幕v在线| 精品亚洲一区二区三区在线播放| 日韩av在线免费观看| 日本精品久久电影| 社区色欧美激情 | 国产一区二区三区高清在线观看| 黑人精品xxx一区| 日韩中文字幕视频在线观看| 日日狠狠久久偷偷四色综合免费| 国产91色在线播放| 欧美大片免费观看| 欧美日韩国产中字| 黑人与娇小精品av专区| 精品人伦一区二区三区蜜桃网站| 26uuu国产精品视频| 久久久亚洲天堂| 亚洲社区在线观看| 国产精品日日做人人爱| 亚洲国产欧美日韩精品| 亚洲欧美一区二区三区情侣bbw| 亚洲久久久久久久久久| 在线观看久久久久久| 欧美激情按摩在线| 一区二区三区无码高清视频| 欧美激情亚洲自拍| 97在线免费观看| 日韩av在线一区二区| 欧美在线观看网址综合| 亚洲男人第一av网站| 一区二区成人精品| 在线激情影院一区| 日韩成人网免费视频| 日韩有码片在线观看| 亚洲电影免费观看高清| 97国产精品视频人人做人人爱| 亚洲无线码在线一区观看| 国内精品国产三级国产在线专| 亚洲日本aⅴ片在线观看香蕉| 97精品国产91久久久久久| 91国产视频在线播放| 日产日韩在线亚洲欧美| 亚洲人成网站免费播放| 欧美疯狂xxxx大交乱88av| 另类专区欧美制服同性| 中文字幕在线精品| 高清日韩电视剧大全免费播放在线观看| 欧美高清第一页| 久久九九精品99国产精品| 最新69国产成人精品视频免费| 韩国一区二区电影| 最新69国产成人精品视频免费| 欧美日韩在线观看视频小说| 亚洲2020天天堂在线观看| 日韩av影片在线观看| 久久精品视频va| 国产精品久久久久久久久久新婚| 亚洲香蕉在线观看| 伊人久久久久久久久久| 久久青草精品视频免费观看| 懂色av中文一区二区三区天美| 亚洲精品按摩视频| 精品国产一区二区三区久久狼黑人| 国产精品一区二区在线| 国产亚洲一区二区在线| 一区二区三区在线播放欧美| 欧美电影在线观看高清| 亚洲自拍偷拍一区| 亚洲欧美日韩国产中文| 久久精品电影网| 久久伊人精品天天| 九九久久国产精品| 91精品视频一区|