你的位置:首页 > Java教程

[Java教程]Java Se:使用Java Runtime 获取ThreadDump


Java Runtime中exe()定义如下: 

exec(String command, String[] envp, File dir)      Executes the specified string command in a separate process with the specified environment and working directory.

在一个单独的进程中在指定的工作目录work directory下使用指定的环境变量envp执行指定的命令cmmand。


 

下面是这个方法的参数说明:

Command:

 

“exeFile” 在windows上执行一个exe文件

“cmd /c batFile” 在windows系统执行一个batFile

“/bin/sh -C shFile” 在Linux系统执行一个sh文件

 

Envp:程序执行时的环境变量,是一个数组,数组中每个元素是key=value形式的。

dir:是程序运行的工作目录,也就是要执行的程序所在的目录,如果要执行的程序已加入环境变量,则可以是null。

 

例如在windows系统中,使用JavaRuntime来启动Tomcat

process = Runtime.getRuntime().exec("cmd /c startup.bat",          env.toArray(new String[0]), new File("E:\\Program Files\\apache\\tomcat\\apache-tomcat-6.0.41\\bin"));

最后的dir是tomcat的bin目录,也就是要执行的batFile所在的目录。 

 

Tomcat已经启动,现在通过Java Runtime来获取Tomcat的ThreadDump。

下面是使用Java 中JStack来获取ThreadDump的程序:

import java.io.IOException;import java.io.InputStream;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Scanner;public class JStack {  public static void main(String[] args) throws InterruptedException {    Process process = null;    List<String> env = new LinkedList<String>();    try {      Map<String, String> currentEnv = System.getenv();      for (String key : currentEnv.keySet()) {        String value = currentEnv.get(key);        if (value != null && !value.isEmpty()) {          env.add(key + "=" + value);        }      }      // "cmd /c jstack -F 8660"// 在命令行使用jps查得tomcat的进程Id是8660。      env.toArray(new String[0]);      System.out.println(env.toString());      process = Runtime.getRuntime().exec("cmd /c jstack -F 8660",          env.toArray(new String[0]), null);      InputStream input = process.getInputStream();      Scanner inputScanner = null;      inputScanner = new Scanner(input);      String line = null;      while (inputScanner.hasNextLine()) {        if ((line = inputScanner.nextLine()) != null) {          System.out.println(line);        }      }      int exitValue;      if (process.waitFor() != 0) {        exitValue = process.exitValue();        if (exitValue == 0) {          if (inputScanner != null) {            inputScanner.close();          }        }      }    } catch (IOException e) {      e.printStackTrace();    } finally {      if (process != null) {        process.destroy();        process = null;      }    }    System.out.println("hello");  }}

 

另外在windows上可以使用 CTRL+BREAKSPACE组合键获取ThreadDump,在Linux上可以使用kill -3 pid来获取ThreadDump。