java - JBoss 上未生成线程转储

标签 java jboss jvm thread-dump

我过去常常通过运行 kill -quit 来生成线程转储,我会将它们放在我的服务器日志所在的日志文件中。当文件变得太大时,我使用 rm 将其删除并创建了一个同名的新文件。 现在,当我使用 kill -quit 进行线程转储时,日志文件中没有任何内容被复制 - 它是空的。

有人能帮忙吗?

最佳答案

Unix 上默认的 JBoss 启动脚本通常类似于:

nohup $JBOSS_HOME/bin/run.sh $JBOSS_OPTS >/dev/null 2>&1 &

这很不幸,因为它会将 stderr 发送到/dev/null。通常这不是问题,因为一旦 log4j 初始化,大多数应用程序输出将转到 boot.log 或 server.log。但是,对于线程转储和其他低级错误,它们会丢失。

最好的办法是更改启动脚本以将 stdout 和 stderr 重定向到一个文件。此外,默认设置中忽略的一件事是重定向标准输入。对于守护进程,最好的做法是将 stdin 重定向到/dev/null。例如:

nohup $JBOSS_HOME/bin/run.sh $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null &

最后,如果您有一个正在运行的进程,您可以使用 JRE 中包含的 jstack 来获取线程转储。这将输出到调用它的控制台。我更喜欢 kill -3 的输出,但 jstack 还允许您查看 native 堆栈帧。

关于java - JBoss 上未生成线程转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/708108/

相关文章:

java - IncationTargetException - 使用 httpClient 从 java Soap Web 服务调用 Rest 服务

java - 将 cron 表达式转换为漂亮的描述字符串?有 JAVA 和 Objective-C 的库吗?

java - 拥有一个字符串,替换然后执行拆分或拥有一组字符串并创建一个新的字符串来更改它会更有效吗?

java - Apache POI WorkFactory.Create(new File()) java.lang.OutOfMemoryError

java - Java中枚举的反序列化

spring - 为托管在不同服务器上的 Web 应用程序实现 SSO

java - Jboss (6.4 EAP) 到 WebSphere (7.x)

java - 通过容器 session 管理在 Java 中使用 POJO RPC 比 JBoss 更简单

java - Java 中操作系统的名称(不是 "os.name")

java - 写入 XLSX 文件 (POI) 时 JVM 崩溃