4

スレッドに割り当てられたバイトを監視するクラスを持つjunitテストケースがあります。日食から、有効な結果を得ることができました。ただし、com.sun.management.ThreadMXBean が提供されていないため、jenkins では機能しません。

これが私のコードです

((com.sun.management.ThreadMXBean)ManagementFactory.getThreadMXBean()).getThreadAllocatedBytes(Thread.currentThread().getId())))

getThreadAllocatedBytes() を取得する必要があるため、com.sun.management.ThreadMXBean を取得するにはどうすればよいですか? Sun/Oracle VM を正しく設定するにはどうすればよいですか?

java.lang.ClassCastException: sun.management.ThreadImpl を com.sun.management.ThreadMXBean にキャストできません

4

3 に答える 3

5

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

于 2013-03-08T06:55:14.543 に答える
0

私はちょうどでこれをやった

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();

それ自体にキャストせずに。同じことを試しましたか?

于 2012-12-14T10:41:38.380 に答える
-1

ThreadMXBean をサポートしていない jvm で実行が行われていたようです。私のant構成では、フォークを新しいスレッドに追加しました。それはうまくいきました。

于 2013-06-03T12:02:34.780 に答える