动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.用SQLJ开发数据库(5).
.一些非常有用的JAVA常用方法( 2).
.开发Eclipse插件.
.一个连接池的例子(来自JIVE).
.通过内部类的一个例子展示java中.
.给JavaBeans增加XPath功能.
.如何在JBOSSServer上发布EJB.
.java设计模式之Bridge(抽象和行为.
.将 EJB 组件作为商务服务提供.
.[webservices开发]使用XFire开发.
.Servlet传送对象给Applet使用.
.SpringAOP在DWR安全上的应用.
.java开发:Swing是MVC设计的典范.
.用Apache Torque项目来提升Java程.
.JAVA中文问题及最优解法.
.针对hibernate,jdbc,sql的思考.
.Java开源项目Hibernate.
.Microsoft Visual Studio .NET 系.
.【新手必读】JAVA入门及FAQ.
.John Hancock互助人寿保险公司.

在Java应用程序中监视CPU的使用

发表日期:2008-1-5 |



  怎样在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(用于与外部工具整合)。
上一篇:使用JAVA技术实现新一代OSS/BSS 人气:518
下一篇:详细说明 MIDP 中的属性问题 人气:360
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号