我有一个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
答案 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添加到一个新线程。它运作得很好。