2

I want to be able to generate a java thread dump for my Java application running on heroku? I saw that heroku has jstack running but I can't figure out how to run it to generate a thread dump on my process. I can't figure out how to get the PID to send to jstack. Once I have the PID to I simply run "heroku jstack -l " from my dev machine (it has toolbelt installed)?

4

3 に答える 3

4

わかりましたので、これが最善の方法です。これにより、プログラムで再作成する代わりに、JVM が使用する形式が得られます。繰り返しますが、これは heroku 用です。他の環境では、このコードを調整する必要があります。これにより、残りのインターフェイスとして公開されます。

@GET
@Transactional
@Path( "/threaddump" )
public Response threadDump() throws Exception {
    dumpThreads();
    return Response.ok().build();
}

public static void dumpThreads() throws Exception {
    ProcessBuilder processBuilder = new ProcessBuilder( "/bin/sh", "-c", "kill -3 $PPID" );
    processBuilder.redirectErrorStream( true );
    Process process = processBuilder.start();
    InputStream inputStream = process.getInputStream();
    StreamUtils.copy( inputStream, System.out );
}
于 2013-05-15T20:17:37.297 に答える
0

このスレッド ダンプを実行するために、Java JMX に REST API を埋め込むことも検討してください。ジョロキアが有力候補のようです。組み込み認証もサポートし、新しい REST エンドポイントを実装しなくても任意の JMX mbean にアクセスできるという点でより柔軟になります。

http://www.jolokia.orgを参照 してください。具体的には、 POST Exec 要求を使用してThreadMXBean.dumpAllThreads()メソッドを呼び出すための REST プロトコルを参照してください。

于 2014-03-07T11:15:00.217 に答える
0

次のことを試すことができます-この関数をいくつかのクラスに入れて、それを呼び出す方法を持ち、出力をファイルに保存するか、ページに表示します...

static StringBuilder allStack() {
    StringBuilder sb = new StringBuilder();
    Map<Thread, StackTraceElement[]> trace = Thread.getAllStackTraces();
    for(Thread t:trace.keySet()){
        StackTraceElement[]trc = trace.get(t);
        sb.append("\n");
        sb.append(t.getName());
        sb.append(" ");         
        sb.append(t.getId());

        sb.append(" |");            
        sb.append(t.getThreadGroup());

        sb.append("| ");            
        sb.append(t);
        sb.append(" :-\n");
        for(StackTraceElement e:trc){
            sb.append(e.toString());
            sb.append("\n");
        }
        sb.append(" -***-\n");
    }
    return sb;
}
于 2013-05-11T20:37:49.813 に答える