com.sun.*
软件包中的代码仅适用于Sun/Oracle JVM,other implementations可能无法访问这些不属于官方JDK的专有类。实质上,Sun在ThreadMXBean
上添加了一些附加功能(并且令人困惑地没有更改名称),但不希望强制所有JVM实现类似地实现此行为。
想必詹金斯不使用(或你的配置不)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将允许。
“不工作”不是一个正确的错误描述。你可能想详细说明一下。 – Stephan