如何在jenkins,junit test上访问com.sun.management.ThreadMXBean的ThreadMx

时间:2012-12-14 10:15:35

标签: java jenkins hudson

我有一个junit测试用例,带有一个类来监视一个线程的已分配字节。从日食中我得到了有效的结果。但是在jenkins中它没有工作,因为没有提供com.sun.management.ThreadMXBean。

这是我的代码

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

如何获取com.sun.management.ThreadMXBean,我需要检索getThreadAllocatedBytes()?我如何设置太阳/神谕Vm对吗?

java.lang.ClassCastException:sun.management.ThreadImpl无法强制转换为com.sun.management.ThreadMXBean

3 个答案:

答案 0 :(得分:3)

com.sun.*包中的代码仅适用于Sun / Oracle JVM,other implementations可能无法访问这些不属于官方JDK的专有类。从本质上讲,Sun在ThreadMXBean上添加了一些额外的功能(并且令人困惑地没有更改名称)但是并不想要求所有JVM实现都类似地实现此行为。

据推测,Jenkins不使用(或者你的配置不是)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允许的信息一样多的信息。

答案 1 :(得分:0)

我只是用

做了这个
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();

没有铸造它。你有同样的尝试吗?

答案 2 :(得分:0)

似乎执行在某个不支持ThreadMXBean的jvm上运行。在我的ant配置中,我将fork添加到一个新线程。它运作得很好。