您的位置:首页 >> 编程开发 >> Java >> J2SE >> 正文
J2SE RSS
 

Java应用程序中监视CPU的使用--使用JNI编写自己的CPU监视器

http://www.rdxx.com 05年07月24日 21:13 JR 我要投稿

关键词: 监视器 , JNI , Java , CPU , 应用程序 , 应用 , 程序
原作:Vladimir Roubtsov
From: JavaWorld.com
原文(javaworld.com)>>>

怎样在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的毫秒数。
  1. public staticnative long getProcessCPUTime();

使用JDK内置的javah工具产生将来本地代码实现使用的C头。
  1. JNIEXPORT jlong JNICALL
  2. Java_com_vladium_utils_SystemInformation_getProcessCPUTime (JNIEnv * env, jclass cls)

二、本地方法实现

在大多数的Win32平台上,该方法可以使用GetProcessTimes()系统调用实现,差不多仅需要3行代码就可以了:
  1. JNIEXPORT jlong JNICALL
  2. Java_com_vladium_utils_SystemInformation_getProcessCPUTime (JNIEnv * env, jclass cls)
  3. {
  4.     FILETIME creationTime, exitTime, kernelTime, userTime;
  5.     
  6.     GetProcessTimes (s_currentProcess, & creationTime, & exitTime, & kernelTime, & userTime);
  7.     return (jlong) ((fileTimeToInt64 (& kernelTime) + fileTimeToInt64 (& userTime)) /
  8.         (s_numberOfProcessors * 10000));
  9. }

该方法首先累加用于执行当前进程的核心和用户代码耗费的时间,除以处理器的数目,并把结果转换到毫秒。fileTimeToInt64()是一个辅助函数,用于把FILETIME结构的数据转换为64位的整数。s_currentProcess 和 s_numberOfProcessors是全局变量,当JVM装载本地库时即初始化。
  1. static HANDLE s_currentProcess;
  2. static int s_numberOfProcessors;
  3. JNIEXPORT jint JNICALL
  4. JNI_OnLoad (JavaVM * vm, void * reserved)
  5. {
  6.     SYSTEM_INFO systemInfo;
  7.         
  8.     s_currentProcess = GetCurrentProcess ();
  9.     GetSystemInfo (& systemInfo);
  10.     s_numberOfProcessors = systemInfo.dwNumberOfProcessors;
  11.     return JNI_VERSION_1_2;
  12. }

注意,如果你在UNIX平台上实现getProcessCPUTime(),你应该以getrusage系统调用开始。

三、调用本地方法

回到Java中,在SystemInformation类中,装载本地库(silib.dll on Win32)最好通过静态初始化代码块完成。

共4页  第1页 第2页 第3页 第4页


 
 
标签: 监视器 , JNI , Java , CPU , 应用程序 , 应用 , 程序 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站