如何访问 com.sun.management.ThreadMXBean on jenkins 的 ThreadMx,j



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

这是我的代码

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

如何获取 com.sun.management.ThreadMXBean for I need to get ThreadAlatedBytes() ? 如何正确设置 sun/oracle VM?

java.lang.ClassCastException: sun.management.ThreadImpl 不能强制转换为 com.sun.management.ThreadMXBean

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;
}

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

我只是用

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();

没有投射到它。你试过一样吗?

似乎执行在某种程度上在不支持 ThreadMXBean 的 jvm 上运行。在我的 ant 配置中,我将 fork 添加到新线程中。效果很好。

最新更新