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)?
質問する
1046 次
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 に答える