【问题标题】:Auto restart jar on OutOfMemoryError Linux在 OutOfMemoryError Linux 上自动重启 jar
【发布时间】:2012-08-26 05:14:32
【问题描述】:

如何在 Linux 中自动重启可运行的 jar 文件。

我在 linux VPS 中在单独的屏幕上运行 jar,但由于 OUTOFMEMORYERROR Java 堆空间,它在一段时间后停止。

【问题讨论】:

  • 您是否考虑过使用 -Xmx 选项增加该应用程序的内存限制?最好完全没有崩溃……
  • 暂时不能增加内存,只能用其他方式。
  • 发生OOME时可以触发外部程序。这可以停止您的进程并开始一个新进程。

标签: java linux heap-memory


【解决方案1】:

您是否尝试过为 jvm 分配更多内存?如果问题仍然存在,那么 您可以关联shutdown hook,但没有保证它会始终执行。您可以从中调用其他进程,这将在延迟后再次启动您的程序

【讨论】:

  • 关机钩子绝对没用。它不会被触发,甚至没有足够的内存来统计一个新线程。这个想法很糟糕。
【解决方案2】:

编写一个简单的启动器,它会在应用程序关闭后重新启动。像这样的:

#!/bin/sh

TEMPFILE=`mktemp`
while true ; do
  echo "`date` Starting application" >> $TEMPFILE
  java -XX:OnOutOfMemoryError="kill -9 %p" -jar application.jar
  sleep 5
done

为了确保虚拟机正确完成,您可能需要在主循环周围考虑以下内容:

try {
    // main loop
    businessLogic();
} catch (OutOfMemoryError E) {
    System.exit(1);
}

编辑:我个人成功地使用Java Service Wrapper 重新启动一个不时失败的apache tomcat,它在应用程序重新部署过多后遭受内存泄漏。您可能想看看它,它非常简单。

【讨论】:

  • 这不起作用,你不能可靠地捕捉到OOM,原因太多了,它可以在任何地方弹出
  • 没错,它~可能~不起作用,但它仍然可以。这与他遇到的错误类型有关。这就是为什么我会使用 JSW 之类的东西,或者是一个强制执行kill -9 的看门狗进程,一旦应用程序关闭。
  • 通常等待 OOM 是个坏主意,因为应用程序可能会丢失(或损坏)数据。当达到某个内存阈值时尝试礼貌地关闭它会更好,而且当可用内存很少并且年轻代变得太小时,java也会很糟糕,因为它会不断触发完整的GC周期。
  • @bestsss:在处理来自第三方的应用程序时,跟踪这类问题非常困难。可以在实际的OOM 发生之前触发某种内存阈值 vm 选项会非常好,但我还没有在今天的任何 JRE 中看到这样的事情。
  • 但我还没有在今天的任何 JRE 中看到这样的东西它是少于 150 行左右的琐碎代码。
【解决方案3】:

试试这个:-XX:OnOutOfMemoryError="<cmd args>; <cmd args>" 编写一个shell脚本来“kill -TERM pid”,然后再次启动它并将脚本放入命令行选项的cmd部分。差不多就是这样,但您需要知道进程的 pid(或依赖 killall 或 ps 等)

您也可以使用monit 定期检查应用程序是否正在运行。这些或多或少是标准解决方案。我自己使用监控守护程序在内存不足时通过电子邮件/短信通知,以便可以进行适当的检查以及是否存在要修复的泄漏。当你有几十 GB 的时候直接转储堆很糟糕。

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 2016-08-17
    • 2013-12-13
    • 2017-06-01
    • 2021-08-07
    • 1970-01-01
    • 2019-08-23
    • 2021-12-09
    • 2016-01-21
    相关资源
    最近更新 更多