我有一个带有一个类的 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 添加到新线程中。效果很好。