パッケージ内のコードは、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 が許可する限り多くの情報を安全に取得できます。