🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: cn.bbs.comp.lang.java
Article #12712

��JavaӦ�ó����м���CPU��ʹ�� chensheng913

#12712
From: ��ţ
Date: Wed, 21 Jul 2004 05:54
126 lines
9255 bytes
������Java�еõ�CPU��ʹ������أ����ͬʱ��һ������Ϣ��һ������Ϣ������Ϣ�Dz�
��ʹ�ô�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_getProcessCP
UTime (JNIEnv * env, jclass cls)
�������ط���ʵ��
�ڴ�����Win32ƽ̨�ϣ��÷�������ʹ��GetProcessTimes()ϵͳ����ʵ�֣�����
��Ҫ3�д���Ϳ����ˣ�
JNIEXPORT jlong JNICALLJava_com_vladium_utils_SystemInformation_getProcessCP
UTime (JNIEnv * env, jclass cls){
    FILETIME creationTime, exitTime, kernelTime, userTime;        GetProcess
Times (s_currentProcess, & creationTime, & exitTime, & kernelTime, & userTim
e);
 return (jlong) ((fileTimeToInt64 (& kernelTime) + fileTimeToInt64 (& userTi
me)) /
    (s_numberOfProcessors * 10000));}
�÷��������ۼ�����ִ�е�ǰ��̵ĺ��ĺ��û�����ķѵ�ʱ�䣬���Դ���������Ŀ��
���ѽ��ת�������롣fileTimeToInt64()��һ�����������ڰ�FILETIME�ṹ�����
ת��Ϊ64λ������s_currentProcess �� s_numberOfProcessors��ȫ�ֱ�������JVMװ
�ر��ؿ�ʱ����ʼ����
static HANDLE s_currentProcess;static int s_numberOfProcessors;JNIEXPORT jin
t JNICALLJNI_OnLoad (JavaVM * vm, void * reserved){
  SYSTEM_INFO systemInfo;
       s_currentProcess = GetCurrentProcess ();
 GetSystemInfo (& systemInfo);
 s_numberOfProcessors = systemInfo.dwNumberOfProcessors;    return JNI_VERSI
ON_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.p
rintln ("native lib '" + SILIB + "' not found in 'java.library.path': "     
       + System.getProperty ("java.library.path"));                        t
hrow 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 CPUUsa
geSnapshot makeCPUUsageSnapshot ()    {        return new CPUUsageSnapshot (
System.currentTimeMillis (), getProcessCPUTime ());    }        public stati
c double getProcessCPUUsage (CPUUsageSnapshot start, CPUUsageSnapshot end)  
  {        return ((double)(end.m_CPUTime - start.m_CPUTime)) / (end.m_time 
- start.m_time);    }
�ġ�һ���򵥵�CPU���ӳ���
��CPU����API���������ˣ�����Ҵ�����һ��singleton���߳���CPUUsageThrea
d�����Զ���ÿ��һ��ʱ������Ĭ����0.5�룩������һ����ݿ��գ�����������е�
CPUʹ���¼��ļ����ߣ�Observerģʽ����
    public void run ()    {
     while (! isInterrupted ())        {
           final SystemInformation.CPUUsageSnapshot snapshot   = SystemInfor
mation.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 ("us
age: 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.addUsageEventL
istener (_this);        monitor.start ();        appmain.invoke (null, new O
bject [] {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\Swin
gSet2\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 machi
ne)
..
[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������
���ⲿ������ϣ���
from-javaworld.com javaresearch���� 
--
�Ҷ���   �q�ɨr�����㣩�q�ɨr
�� ��Դ:���Ұ��Ͽ�վ nkbbs.org��[FROM: 202.113.227.189] 
Technical Details
Message-ID: <4DJRAf$AOK@bbs.nankai.edu.cn>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!newshub.sdsu.edu!cyclone.bc.net!sjc1.usenetserver.com!news.usenetserver.com!news.bylinux.net!maily.cic.tsinghua.edu.cn!news2.happynet.org!NanKai

Show Full Headers
Complete Article Headers
X-Google-Thread: f6cb0,aa0100c0720dc371,start
X-Google-Attributes: gidf6cb0,public
X-Google-Language: Chinese,GB
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!newshub.sdsu.edu!cyclone.bc.net!sjc1.usenetserver.com!news.usenetserver.com!news.bylinux.net!maily.cic.tsinghua.edu.cn!news2.happynet.org!NanKai
From: holyelle.bbs@bbs.nankai.edu.cn (��ţ)
Newsgroups: cn.bbs.comp.lang.java
Subject: ��JavaӦ�ó����м���CPU��ʹ��     chensheng913
Date: 21 Jul 2004 05:54:31 GMT
Organization: �Ұ��Ͽ�վ
Message-ID: <4DJRAf$AOK@bbs.nankai.edu.cn>
X-Filename: Java/M.1090389257.A
Lines: 126