2012-12-14 33 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