質問

いので何らかのログを毎時間 Thread.interrupt() と呼ばれ、ログインするスレッド発行の話とその現在のスタックなどの識別に関する情報スレッドが中断されます。

があるのか?情報検索したいを参照しての実施可能性、セキュリティマネージャ.で感じることができる実行時例えば、アプレットまたはWeb Startにはクライアント)、またはさせていただきます。ツールの設置JVMい。

やはりえるのか?

役に立ちましたか?

解決

クイックハックのように、これは私はそれが可能だろうと思ったよりも行うことがの容易なの多くでした。

:このクイックハックですので、私はなど、スタックトレースは、配列を参照解除する前に十分な深さであることを保証するようなことをしなかった、私は私の署名付きアプレットのコンストラクタに次のように挿入されました
log.info("Old security manager = " + System.getSecurityManager());
System.setSecurityManager(new SecurityManager() {
      @Override
      public void checkAccess(final Thread t) {
        StackTraceElement[] list = Thread.currentThread().getStackTrace();
        StackTraceElement element = list[3];
        if (element.getMethodName().equals("interrupt")) {
          log.info("CheckAccess to interrupt(Thread = " + t.getName() + ") - "
                   + element.getMethodName());
          dumpThreadStack(Thread.currentThread());
        }
        super.checkAccess(t);
      }
    });

以下のようにdumpThreadStack方法がある:

public static void dumpThreadStack(final Thread thread) {
  StringBuilder builder = new StringBuilder('\n');
  try {
    for (StackTraceElement element : thread.getStackTrace()) {
      builder.append(element.toString()).append('\n');
    }
  } catch (SecurityException e) { /* ignore */ }
  log.info(builder.toString());
}

私は、当然のことながら、生産コードでこれを残すことができませんでしたが、それは私が期待していなかったinterrupt()を引き起こしたスレッドを正確に私に教えて足ります。それは私がThread.interrupt()へのすべての呼び出しのためのスタックダンプを取得し、代わりにこのコードで、である。

他のヒント

にしてもあまりにも野生のしているの Javaデバッグ API?んが撮影MethodEntryEventsにねじになります。interrupt()に思います。

Eeek、そのインタフェースも要チェックですoout新 JVMのツール インタ.

私は、メソッドの呼び出しをラップするために AspectJのとその機能になります。 実行ポイントカットの周りinterrupt()方法は、ここに役立つはずです。

あなたはJavaシステム・メソッド呼び出し(アプリケーションコードではなく)、上記を傍受するために探しているので、のことのは適切ではないことに注意してください。 このスレッドにはそれが可能だ示唆しているようだが、彼はだということに注意してくださいの織のrt.jarのを作成します。

他の人が言ったように...それはJVMTIはおそらく行くための最もハードコアな方法であるワンタイムのものがある場合。しかし、ちょうど楽しみとして(多分Thread.interrupt()呼び出し(またはThread.interruptを変更する直前に作成した静的メソッドへの呼び出しを挿入するエージェントを作成するために、ASMライブラリおよび計測APIを使用することができ)同じことを行うための方法、私は)あなたがそれを行うことができると思います。

はどちらも、学ぶためにいくつかの時間がかかりますが、で動作するのは非常に楽しいですし、あなたがそれを手に入れるたら、あなたは将来:-)で面白い物事のすべての種類のためにそれらを使用することができます 私は本当に今ここに貼り付けることが何か良いスニペットを持っていませんが、ASMの周りグーグル場合は、多分私はあなたがインスピレーションを見つけることになると思いASMのいくつかの創造的な使用のためにJIPを見ます。

JIP:のJavaインタラクティブプロファイラする

きみもJMX:

ManagementFactory.getThreadMXBean().getThreadInfo(aThreadID)

ThreadInfo オブジェクトログインすることができます:

  • のスレッドのスタックトレース
  • 一般userful情報氏名、状態、など
  • など

編集

利用getAllThreadIds()するためのリストを取得するためのライブスレッドのid:

long[] ids = ManagementFactory.getThreadMXBean().getAllThreadIds();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top