通过环境变量控制Java进程的内存

时间:2018-04-19 12:27:35

标签: java javac bsd ulimit

我需要运行一个包含对java的调用的脚本。我无法更改该脚本(因为它必须在各种机器上运行),但我可以改变它周围的环境。

如果有帮助,我可以在它周围运行一个包装脚本。

我的根本问题是java进程退出:

Could not allocate metaspace: 1073741824 bytes

虚拟内存限制为:

$ ulimit -v
2097152

如果有不同的话,我可能还需要它才能为javac工作。

2 个答案:

答案 0 :(得分:0)

您可以使用-Xmx减少Java使用的内存量,但需要在调用java的命令行上调用。幸运的是有别名。 这与直接更改环境变量不同,因此最终可能无法解决您的问题。

所以,你写了一个包装脚本:

#!/bin/bash
alias java="java -Xmx120M"
alias javac="javac -J-Xmx120M"
shopt -s expand_aliases
source /path/to/the/original/script.sh

这样,对java someoption Someclass的所有来电都会显示为java -Xmx120M someoption Someclass

当然,只有在调用有问题的java代码的脚本中不存在-Xmx时,这才能正常工作。它只适用于被调用的脚本之后不调用其他脚本的情况。

它是如何工作的: alias将一个命令替换为另一个命令。 shopt -s expand_aliases打开了别名功能(但在新脚本启动时重置了该功能) source ...somescript.sh加载此脚本中的其他脚本,就好像它在哪里一样。这可以防止上述商品的缺点。但只有一层深。

答案 1 :(得分:0)

有一种inbuild方法可以向程序提供java参数,在这些程序中你不能指定JVM的构建(例如你的情况,但是如果java命令来自二进制文件),并且它被称为JAVA_TOOL_OPTIONS

在您的情况下,您可以设置:

JAVA_TOOL_OPTIONS="-Xmx120M"

到你的环境。