【问题标题】:Java - under which circumstances may a JVM abruptly crash?Java - 在什么情况下 JVM 可能会突然崩溃?
【发布时间】:2012-05-02 20:21:11
【问题描述】:

我正在我的 ubuntu 机器上运行一个守护进程 java 进程:

java -cp (...) &> err.log&

进程随机运行一段时间,然后消失。日志中没有任何内容,err.log,没有创建 JVM 崩溃文件 (hs_err_*.log),什么都没有。我的两个问题是:

1) java进程在什么情况下会突然结束?

2) 有没有办法知道进程发生了什么(知道 PID)? UNIX 是否以某种方式保留有关已完成进程的信息?

【问题讨论】:

  • 您是否尝试过运行 JConsole?它提供了一些有用的信息,可能会有所帮助。
  • 你确定它是崩溃而不是正常退出?
  • 有没有办法在应用退出时添加堆栈跟踪?
  • 宇宙射线可能会在非 ECC 内存上翻转一个危险位 :)

标签: java unix process jvm daemon


【解决方案1】:

我会使用YAJSW 将它作为守护进程运行,因为它允许通过多种方式监控内存等,具有重启选项,您还可以启用包装进程日志,以便在出现问题时获得更多信息.

【讨论】:

    【解决方案2】:

    1) java 进程在什么情况下会突然结束?

    当它自己退出但我猜你排除了它或者当它被 SIGKILL 杀死时。如果您在 Linux 上,这可能是 oom 杀手。您查看系统消息日志了吗?

    2) 有没有办法知道进程发生了什么(知道 PID)?

    除非您配置一些跟踪工具来获取该信息,否则通常不会

    UNIX 是否以某种方式保存有关已完成进程的信息?

    不,但根据您使用的 Unix 变体,这可能很容易添加。 在您的示例中,您可以使用 echo $?

    打印进程退出状态

    如果是265,则意味着进程已被信号 9 (=265-256) 杀死。

    【讨论】:

      【解决方案3】:

      我会编写一个简单的 shell 脚本,当 JVM 终止时它会以某种方式提醒我。也许发送一封带有 JVM 退出代码的电子邮件。

      #!/bin/sh
      
      # Launch JVM and wait...
      java -cp ...
      
      # do something with the exit code $?
      # log it to a file or mail it yourself
      

      也许,退出代码可能会透露一些信息。

      【讨论】:

        猜你喜欢
        • 2023-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        相关资源
        最近更新 更多