Gradle:增加由gradle运行任务启动的Java进程的堆大小

19

我有一个Gradle任务,它启动了一个Java项目。基本上就像这样:

gradle run -PmainClass=package.path.ServiceMain
现在,我想增加由Gradle启动的Java进程的堆大小,因为标准堆大小太小了。问题是我只能成功地增加Gradle进程的大小,而不能增加由Gradle项目启动的Java进程的大小。我使用以下命令在我的Java代码中检查堆大小:
Runtime.getRuntime().totalMemory()

我测试了这个检查,发现它可以像这样使用。但是它告诉我,Gradle始终使用相同的堆大小启动我的Java进程。

我尝试了这些选项:

DEFAULT_JVM_OPTS='-Xmx1024m -Xms512m'
GRADLE_OPTS='-Xmx1024m -Xms512m'
JAVA_OPTS='-Xmx1024m -Xms512m'

没有成功。

我还尝试了这个:

gradle run -PmainClass=package.path.ServiceMain -DXmx1024m -DXms512m

仍然没有成功。

当然,我已经搜索了网络,但我只找到了一些提示,说我可以修改build.gradle文件。不幸的是,这不是我想要或能够做的。

我需要在命令行上指定Java程序的堆大小,以便通过gradle运行任务启动它(由于实际项目结构)。

提前感谢您的支持。任何帮助都将不胜感激。


3
如果不修改build.gradle脚本是不可能的。 - Opal
1
如果您放宽对build.gradle的要求,可以在此处找到不错的解决方案:https://dev59.com/EmAg5IYBdhLWcg3wWp7- - charlie_pl
谢谢你的提示charlie_pl,但是据我所知这篇文章是关于程序参数而不是JVM参数。或者我有什么误解吗? - J.R.
2个回答

19

正如@Opal在上面所说,这是不可能的

我目前找到的最简单/最容易的替代方法是向build.gradle文件中添加这个小片段:

tasks.withType(JavaExec) {
    jvmArgs = ['-Xms512m', '-Xmx512m']
}

或者,可以使用环境变量 _JAVA_OPTIONS

更好的方法是:使用环境变量 JAVA_TOOL_OPTIONS;该变量的内容将被用作(附加的)JVM选项。

感谢@ady提供的提示。


对于这个特定的问题,环境变量是最好的选择。但是关于编辑build.gradle文件,你可以使用tasks.withType..而不仅仅是run { jvmArgs = ...}吗?参考链接:https://blog.jakubholy.net/2020/customizing-gradle-run-task/ - Jakub Holý
1
@JakubHolý:确实,这也可能是一种选择。但是这仅限于运行任务,并且如果需要在测试任务中使用它,则需要将其复制到测试任务中,对吗? - J.R.

7
在Linux中使用以下命令:export _JAVA_OPTIONS="-Xms4000m -Xmx8000m",其中的值4000和8000可以更改。使用_JAVA_OPTIONS而不是JAVA_OPTS。
org.gradle.jvmargs=-Xmx2024m -XX:MaxPermSize=512m

来源: https://riptutorial.com/gradle/example/11911/tuning-jvm-memory-usage-parameters-for-gradle

本文介绍如何为Gradle调整JVM内存使用参数。Gradle是一个开源构建自动化工具,用于将源代码编译成可执行文件或库等产品。优化Gradle的JVM内存使用参数可以提高Gradle的性能和稳定性。调整这些参数需要在Gradle启动时添加参数来设置。本文介绍了如何使用命令行和build.gradle文件来调整这些参数,并给出了常用的参数值。

3
我明白了,那么您可以在Linux中使用此命令:export _JAVA_OPTIONS="-Xms4000m -Xmx8000m",其中的值4000和8000可以更改。请使用"_JAVA_OPTIONS"而不是"JAVA_OPTS"。 - ady
1
_JAVA_OPTIONS参数会自动进行评估。 - ady
1
哇!"export _JAVA_OPTIONS"正是我在运行gradlew时将-javaagent=/mypath/myjavaagent.jar参数传递给JVM所需的。感谢@ady提供的答案!如果我只设置"export JAVA_OPTIONS",那么这些值仅会传递给Gradle而不会传递给JVM。 - Lucy
2
感谢 @ady 的贡献:我发现 JAVA_TOOL_OPTIONS 也可用并有文档支持: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/envvars002.html - Lucy
使用_JAVA_OPTIONS来设置这些标志比JAVA_OPS更好,这正是我一直在寻找的。这实际上很难找到。 - KC54
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接