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
包中的代码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 允许的尽可能多的信息。