当我向我的Java程序发出kill -3 <pid>命令时,它会在控制台上生成线程转储。
kill -3 <pid>
brccelvz1#
两个选项:
使用重定向的标准输出运行Java应用程序
java com.example.MyApp > out.txt
请改用jstack。
jstack
jstack实用程序允许您获取线程转储,并将输出发送到当前控制台,而不是Java应用程序的stdout,从而允许您对其进行重定向。例如,如果Java应用程序的PID是12345(使用jps实用程序可快速找到它):
jstack 12345 > threads.txt
goqiplq22#
我通常使用NetBeans分析器,但是jvisualvm可以从命令行获得。
sxpgvts33#
如果您需要所有线程的详细信息和其他JVM详细信息,请尝试jconsole。
xxe27gdn4#
请将以下JVM参数附加到应用程序中。线程转储应在dump.log中捕获。
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=dump.log
请注意,它不重定向,但启用JVM诊断日志记录。因此,也可能存在开销。但是,如果环境中可以有JDK,则可以使用jstack或jcmd(jcmd is preferred with JDK 1.8)捕获线程转储并重定向到文件。
rsl1atfo5#
您可以使用除kill -QUIT方式之外的4种方式生成java thread dumps。
5条答案
按热度按时间brccelvz1#
两个选项:
使用重定向的标准输出运行Java应用程序
请改用
jstack
。jstack实用程序允许您获取线程转储,并将输出发送到当前控制台,而不是Java应用程序的stdout,从而允许您对其进行重定向。
例如,如果Java应用程序的PID是12345(使用jps实用程序可快速找到它):
goqiplq22#
我通常使用NetBeans分析器,但是jvisualvm可以从命令行获得。
sxpgvts33#
如果您需要所有线程的详细信息和其他JVM详细信息,请尝试jconsole。
xxe27gdn4#
请将以下JVM参数附加到应用程序中。线程转储应在dump.log中捕获。
请注意,它不重定向,但启用JVM诊断日志记录。因此,也可能存在开销。
但是,如果环境中可以有JDK,则可以使用jstack或jcmd(jcmd is preferred with JDK 1.8)捕获线程转储并重定向到文件。
rsl1atfo5#
您可以使用除kill -QUIT方式之外的4种方式生成java thread dumps。