2012-12-14 36 views
2

我有一個JUnit測試用例類監視線程分配的字節。從日食我能夠得到有效的結果。然而在jenkins中它不起作用,因爲com.sun.management.ThreadMXBean沒有提供。如何訪問com.sun.management.ThreadMXBean的ThreadMx對詹金斯,JUnit測試

這裏是我的代碼

((com.sun.management.ThreadMXBean)ManagementFactory.getThreadMXBean()).getThreadAllocatedBytes(Thread.currentThread().getId())))

因爲我需要檢索getThreadAllocatedBytes()如何能得到com.sun.management.ThreadMXBean的持有?我怎樣才能設置太陽/甲骨文Vm的權利?

java.lang.ClassCastException:sun.management.ThreadImpl不能轉換到com.sun.management.ThreadMXBean

+0

「不工作」不是一個正確的錯誤描述。你可能想詳細說明一下。 – Stephan

回答

0

看來,在執行上有所不支持ThreadMXBean的一個JVM上運行。在我的ant配置中,我添加了fork到一個新線程。它效果很好。

0

我這樣做只是

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); 

沒有鑄造itseft。你嘗試過嗎?

+0

在somepoint我需要到區分它,因爲com.sun.management.ThreadMXBean有.getThreadAllocatedBytes() – Njax3SmmM2x2a0Zf7Hpd

+0

做什麼類被你導入才能?你的例子使用的'ThreadMXBean'幾乎可以肯定[java.lang.managment.ThreadMXBean](http://docs.oracle.com/javase/7/docs/api/java/lang/management/ThreadMXBean.html),問題是關於子接口[com.sun.management.ThreadMXBean](http://docs.oracle.com/javase/7/docs/jre/api/management/extension/com/sun/management/ThreadMXBean.html)這通常是但不總是從ManagementFactory.getThreadMXBean()返回的實現。 – dimo414

2

com.sun.*軟件包中的代碼僅適用於Sun/Oracle JVM,other implementations可能無法訪問這些不屬於官方JDK的專有類。實質上,Sun在ThreadMXBean上添加了一些附加功能(並且令人困惑地沒有更改名稱),但不希望強制所有JVM實現類似地實現此行爲。

想必詹金斯不使用(或你的配置不)Oracle的JVM。瘋狂的猜測,但它可能使用JRockit。

一般來說,你應該實現代碼假設com.sun.*類不是默認情況下可用,並且應該在運行時檢查是否其實他們。例如,下面是我當前如何處理ThreadMXBean問題的一個片段:

private static boolean enableBeanInspection = true; 
private ThreadMXBean tBean = null; 
private com.sun.management.ThreadMXBean sunBean = null; 

public ThreadInspector() { 
    // Ensure beans are null if we can't/don't want to use them 
    if(enableBeanInspection) { 
     tBean = ManagementFactory.getThreadMXBean(); 
     if(tBean instanceof com.sun.management.ThreadMXBean) { 
      sunBean = (com.sun.management.ThreadMXBean)tBean; 
     } 

     if(tBean.isThreadCpuTimeSupported()) { 
      if(!tBean.isThreadCpuTimeEnabled()) { 
       tBean.setThreadCpuTimeEnabled(true); 
      } 
     } else { 
      tBean = null; 
     } 

     if(sunBean != null && sunBean.isThreadAllocatedMemorySupported()) { 
      if(!sunBean.isThreadAllocatedMemoryEnabled()) { 
       sunBean.setThreadAllocatedMemoryEnabled(true); 
      } 
     } else { 
      sunBean = null; 
     } 
    } 
} 

protected long getThreadTime() { 
    if(tBean != null) { 
     return tBean.getThreadCpuTime(threadId); 
    } 
    return -1; 
} 

protected long getThreadMemory() { 
    if(sunBean != null) { 
     return sunBean.getThreadAllocatedBytes(threadId); 
    } 
    return -1; 
} 

這種防禦假設 - 我們 - 不要 - 有豆的圖案讓你安全地得到儘可能多的信息,JVM將允許。

+0

這會在沒有com.sun.management.ThreadMXBean的JVM上失敗,因爲您的類會導入它。你需要使用反射來訪問那個類:-( –

+0

哈哈,當然是這樣,當我在電腦上時我會糾正它。 – dimo414