有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JBoss上未生成java线程转储

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

有人能帮忙吗


共 (3) 个答案

  1. # 1 楼答案

    如果这是on*nix,当你删除一个文件时,仍然打开该文件的所有人都将继续写入旧的(现在丢失的)文件。只有在关闭所有文件句柄时,才会真正删除该文件

    您必须使JVM关闭并重新打开日志文件。不确定这是否可以在不重启的情况下完成

  2. # 2 楼答案

    Unix上的默认JBoss启动脚本通常如下所示:

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

    这很不幸,因为它将stderr发送到/dev/null。通常这不是问题,因为一旦log4j初始化,大多数应用程序输出将进入引导状态。日志或服务器。日志然而,对于线程转储和其他低级错误,它们会丢失

    最好是更改启动脚本,将stdout和stderr重定向到一个文件。此外,默认设置中忽略的一件事是重定向stdin。对于守护进程,最好将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也允许您查看本机堆栈帧

  3. # 3 楼答案

    如果你进入jmx找到jboss。system:service=Logging,type=log4jsservice然后您可以调用reconfigure方法,该方法将导致log4j重新打开其任何日志文件。那么,杀戮-放弃应该会起作用