【问题标题】:Get Unix Thread Dump获取 Unix 线程转储
【发布时间】:2013-11-06 17:43:55
【问题描述】:

我正在尝试在 java 应用程序上获取 unix(solaris 和 linux)线程转储。

1) 当java应用是tomcat web应用时, 使用 kill -3 ,转储到 catalina.out 文件,因为这是标准输出。 kill -3 pid > td.out 不起作用。

2) 对于另一个 spring 独立 java 应用程序,我如何找到它的标准输出。 我用过: kill -3 pid,我检查了我的应用程序日志,但我找不到任何东西。

请告知我如何确定 java 应用程序的标准输出并查看线程转储。

谢谢, B.

【问题讨论】:

    标签: java linux unix


    【解决方案1】:

    如果您使用的是 OpenJDK 或 Sun JDK 6 或更高版本,请尝试 bin 文件夹中的 jstack 命令。当由于某种原因将标准输出重定向到文件有问题时,这很有用。执行以下命令,传入 Java 进程 ID:

    jstack -l JAVA_PID > jstack.out
    

    【讨论】:

    • 在unix机器上,我无法访问jdk,只有jre 1.6。因此我使用的是 kill -3 pid 或 kill -QUIT pid。
    • 我发现了这个:stackoverflow.com/questions/4876274/… 将以下内容添加到 java 程序中,这会将 jvm 内容重定向到文件 -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log 这有效但必须更改 java 参数。
    【解决方案2】:

    尝试使用进程

    Process p = null;
    String cmd[] = {"bash","-c","ps -C java | awk '{ print $1; }' | sed -n '2{p;q;}'"};
    try
    {
    p = Runtime.getRuntime().exec(cmd);
    try
    {
    p.waitFor();
    System.out.println("Executed Successfully");
    }catch(Exception e)
     {
    e.printStackTrace();
    }
    
    }catch(Exception e)
    {
    e.printStackTrace();
    }
    

    然后通过BufferReader读取该行并使用上面的函数杀死并输出相同

    命令说明:

    ps -C java | awk '{ print $1; }' | sed -n '2{p;q;}'
    

    “ps -C ProcessName”告诉进程是否使用pid运行,这里使用Java作为ProcessName

    " awk '{ print $1; }' " 输出输出的第一行

    “sed -n '2{p;q;}”显示第二列

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      相关资源
      最近更新 更多