2013-11-05 77 views
7

我正在嘗試使用Java來獲取當前運行的Java虛擬機使用的CPU的百分比。我的研究指出我使用com.sun.management.OperatingSystemMXBean類。網上下面的例子中,我寫了下面的:使用OperatingSystemMXBean獲取CPU使用率

import java.lang.management.ManagementFactory; 
import com.sun.management.OperatingSystemMXBean; 


public class TestClass { 

public static void main (String[] args) { 
    OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 

    System.out.println(bean.getProcessCpuLoad()); 
    System.out.println(bean.getSystemCpuLoad()); 

    } 

} 

測試這兩臺機器上後,我不能停止獲取的-1.0兩個呼叫的結果。我曾嘗試通過各種方法使用64位和32位版本的Java 7和6來運行此代碼。不過,我得到的是打印出來的-1.0其中,according to the Javadocs

All values betweens 0.0 and 1.0 are possible depending of the activities going on in the system. If the system recent cpu usage is not available, the method returns a negative value.

我不知道還能在這裏做什麼。加載CPU非常關鍵,我想避免使用另一個類似Sigar的庫。任何人有任何建議或對這個問題有任何見解?

回答

21

只是回答我自己的問題,以防它可以幫助別人。

我在做什麼在技術上是正確的,但是我沒有給OperatingSystemMXBean足夠的時間來收集CPU使用率信息。實際上,JVM在收集CPU使用率信息之前必須運行幾秒鐘,然後刷新分辨率與實現相關。

有以下變化運行的代碼將開始生產使用信息後,我的機器上約2秒:

public static void main(String[] args) { 
    OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory 
      .getOperatingSystemMXBean(); 

    while (true) { 
     System.out.println(bean.getProcessCpuLoad()); 
     System.out.println(bean.getSystemCpuLoad()); 
    } 

} 

希望這可以幫助別人

+0

感謝這個答案,但我觀察到,運行此代碼將CPU利用率提高30-40%。這意味着,只要我們運行此代碼,我們就會獲得更高的CPU利用率 –

+3

@Shashank此代碼僅用於說明獲取CPU使用率信息的滯後性。在真實系統中,您不應該在無限循環中進行此調用。在應用程序運行幾分鐘後,每個用例就足夠了。 – Kon

+0

即使將此代碼運行1-2秒也會增加CPU使用率。 –