我正在尝试上传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
但我仍然遇到同样的错误。
我在这里缺少什么?
答案 0 :(得分:0)
最终,无论您在哪个平台上运行,您都可以使用有限的最大堆。在Windows 32位中,这大约是2GB(不是专门的堆,而是每个进程的总内存量)。恰好,Java恰好使默认设置更小(可能是因为程序员无法创建具有失控内存分配的程序而不会遇到此问题并且必须仔细检查他们正在做什么)。
因此,您可以采用多种方法来确定所需的内存量或减少所使用的内存量。垃圾收集语言(如Java或C#)的一个常见错误是保留对不再使用的对象的引用,或者在可以重用它们时分配许多对象。只要对象具有对它们的引用,它们将继续使用堆空间,因为垃圾收集器不会删除它们。
在这种情况下,您可以使用Java内存分析器来确定程序中的哪些方法正在分配大量对象,然后确定是否有办法确保它们不再被引用,或者不在它们中分配它们。第一名。我过去使用的一个选项是“JMP”http://www.khelekore.org/jmp/。
如果由于某种原因确定要分配这些对象,并且需要保留引用(取决于您正在执行的操作,可能就是这种情况),您只需要在启动时增加最大堆大小程序。但是,一旦你进行了内存分析并了解了如何分配对象,你应该更好地了解你需要多少内存。
一般情况下,如果你不能保证你的程序会在一些有限的内存中运行(可能取决于输入的大小),你总会遇到这个问题。只有在耗尽所有这些后才需要查看缓存对象到磁盘等。此时你应该有一个很好的理由说“我需要Xgb内存”,你不能通过改进来解决它你的算法或内存分配模式。通常情况下,只有在大型数据集(如数据库或某些科学分析程序)上运行的算法才会出现这种情况,然后缓存和内存映射IO等技术变得有用。
使用命令行选项-Xmx
运行Java,该选项设置堆的最大大小。
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html#nonstandard
答案 1 :(得分:0)
问题在于,由于gradle无法处理符号链接,因此包的实际大小要高得多。
当我手动处理符号链接时,问题就结束了。
答案 2 :(得分:-1)
可以在gradle项目的根目录中的gradle.properties
文件中设置JVM堆大小。像这样:
org.gradle.jvmargs=-Xms256m -Xmx1024m