Gradle 上载存档时的渐变堆错误

Gradle 上载存档时的渐变堆错误,gradle,Gradle,我正试图上传一个600MB大小的档案 我得到这个错误: Execution failed for task ':uploadArchives'. > Java heap space ... ... Caused by: java.lang.OutOfMemoryError: Java heap space 我尝试设置GRADLE_OPTS、JVM_OPTS和MAVEN_OPTS变量,以设置最大堆大小,例如: export GRADLE_OPTS=-Xmx1024m gradle uplo

我正试图上传一个600MB大小的档案

我得到这个错误:

Execution failed for task ':uploadArchives'.
> Java heap space
...
...
Caused by: java.lang.OutOfMemoryError: Java heap space
我尝试设置GRADLE_OPTS、JVM_OPTS和MAVEN_OPTS变量,以设置最大堆大小,例如:

export GRADLE_OPTS=-Xmx1024m
gradle uploadArchives
但我还是犯了同样的错误


我在这里遗漏了什么?

归根结底,无论在什么平台上运行,您都可以使用有限的最大堆。在Windows 32位中,这大约是2gb(不是堆,而是每个进程的内存总量)。Java恰好使默认值变小(可能是为了让程序员无法创建内存分配失控的程序,而不遇到这个问题,并且必须准确地检查它们在做什么)

因此,有几种方法可以用来确定所需的内存量或减少正在使用的内存量。Java或C等垃圾收集语言的一个常见错误是保留对不再使用的对象的引用,或者在可以重用它们时分配许多对象。只要对象有对它们的引用,它们就会继续使用堆空间,因为垃圾收集器不会删除它们

在这种情况下,您可以使用Java内存分析器来确定程序中的哪些方法正在分配大量对象,然后确定是否有办法确保不再引用这些对象,或者一开始就不分配它们。我过去使用的一个选项是“JMP”

如果您确定分配这些对象是有原因的,并且需要保留引用(取决于您正在执行的操作,可能是这种情况),那么启动程序时只需要增加最大堆大小。但是,一旦您完成了内存分析并了解了对象是如何分配的,您就应该更好地了解您需要多少内存

一般来说,如果您不能保证您的程序将在有限的内存中运行(可能取决于输入大小),您将始终遇到这个问题。只有在耗尽所有这些之后,您才需要研究将对象缓存到磁盘等。此时,您应该有一个很好的理由说“我需要Xgb的内存”,而您不能通过改进算法或内存分配模式来解决它。通常情况下,这只适用于在大型数据集(如数据库或某些科学分析程序)上运行的算法,然后缓存和内存映射IO等技术变得有用

使用命令行选项
-Xmx
运行Java,该选项设置堆的最大大小


问题在于,由于gradle无法处理符号链接,包的实际大小要大得多


当我手动处理符号链接时,问题就解决了。

JVM堆大小可以在gradle项目根目录下的
gradle.properties
文件中设置。像这样:

org.gradle.jvmargs=-Xms256m -Xmx1024m

您是否碰巧使用了包装器?@BenjaminMuschko遗憾的是,没有。如果gradle守护进程被激活,JVM内存选项应该在用户属性文件“~/.gradle/gradle.properties”(例如,设置属性“org.gradle.jvmargs=-Xms128m-Xmx512m”)中设置。感谢您花时间回答。如你所见,我正在使用'gradle'的'maven'插件的'uploadArchives'功能。我无法控制程序希望何时以及如何使用内存。我手里只有一个很大的档案,还有一堆放不下的东西。正如我在问题中所说的,-Xmx选项不起作用。我使用gradle提供的现有代码,分配/解除分配与我无关。我认为归档文件之所以很大,是因为gradle无法处理符号链接。我已经解决了这个问题,我不再有这个问题了;你的答案很短,很难理解。你应该通过增加更多的描述,特别是解释它是如何解决提问者的问题的,从而使它变得更好;此外,使用标记来格式化代码片段也很有用。