如何在jenkins、junit测试上访问com.sun.management.ThreadMXBean的ThreadMx

Nja*_*Hpd 4 java hudson jenkins

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

这是我的代码

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

我需要检索 getThreadAllocationBytes() ,如何获取 com.sun.management.ThreadMXBean ?我怎样才能正确设置sun/oracle Vm?

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

dim*_*414 5

包中的代码com.sun.*仅适用于 Sun/Oracle JVM,其他实现可能无法访问这些不属于官方 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;
}
Run Code Online (Sandbox Code Playgroud)

这种防御性假设“我们没有 bean”模式可以让您安全地获取 JVM 允许的尽可能多的信息。