gpt4 book ai didi

java - 我可以在 JVM 在 OOM 上调用的脚本中使用 "kill %p"

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:10 25 4
gpt4 key购买 nike

我仍在准备对此进行测试,但在继续之前我需要一些意见。我正在 gradle 中使用 JVM 设置内存不足处理。其中一部分涉及创建一个重新启动脚本,以便在 OOM 时由 JVM 选项调用。

它的工作方式是我首先

task appStartScripts(type: CreateStartScripts) {
def tplName = 'startBinTemplate.sh'
assert project.file(tplName).exists()
unixStartScriptGenerator.template = resources.text.fromFile(tplName)
defaultJvmOpts = [
"-XX:+HeapDumpOnOutOfMemoryError",
"-XX:HeapDumpPath=\$HOME/apps/log/",
"-XX:OnOutOfMemoryError=./restart.sh",

"-Xms1G", "-Xmx2G",
"-Dapp.name=${rootProject.name}"]

dependsOn shadowJar
applicationName = 'start'
defaultJvmOpts += ["-Dspring.profiles.active=ENV_VARIABLE"]
classpath = startShadowScripts.classpath
mainClassName = startShadowScripts.mainClassName
outputDir = new File(project.buildDir, 'scriptsShadow')

doLast {
unixScript.text = unixScript.text.replace('\\$HOME', '\'"$HOME"\'')
unixScript.text = unixScript.text.replace('ENV_VARIABLE', '\'"$1"\'')
}
}

理论上,出现内存不足错误时,将调用重新启动脚本:

#!/usr/bin/env sh

kill -9 %p
sleep 5
./start.sh

这将杀死进程, hibernate 5 秒,然后使用启动脚本重新启动它。我的问题是关于kill 的%p 参数。我可以在这种情况下的脚本中使用它,而不是 JVM 参数本身吗?我的理解是它应该传递给 JVM 参数,然后使用它传递服务 PID 来终止服务。就我而言,我在脚本中使用它,因为尝试将 kill -9 %p 传递给 $JVM_ARGS 会导致启动时出错:

Unrecognized option: -9

而传递要调用的脚本似乎不会导致任何问题。

我仍在为此设置一个测试用例,但我想问:

  1. 有人这样做过吗?您的经历如何?
  2. 有没有更好的方法可以解决这个错误?

最佳答案

当执行 OnOutOfMemoryError 时,

%p 占位符由 JVM 解析。您必须在命令 -XX:OnOutOfMemoryError=./restart.sh %p 中使用,然后从 restart.sh 中的 $1 读取它。

现代 JVM 具有 ExitOnOutOfMemoryError 选项,其行为与 OnOutOfMemoryError="kill -9 %p" 相同(请参阅 JDK-8152669 )。您可以将其与显示的 bash 脚本结合使用 in this answer :

#!/bin/sh

while true ; do
java -XX:+ExitOnOutOfMemoryError -jar application.jar
sleep 5
done

关于java - 我可以在 JVM 在 OOM 上调用的脚本中使用 "kill %p",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57080767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com