如何在 MonoDevelop 中编译 MonoDroid App 时修复“OutOfMemoryError: java heap space”

Posted

技术标签:

【中文标题】如何在 MonoDevelop 中编译 MonoDroid App 时修复“OutOfMemoryError: java heap space”【英文标题】:How to fix "OutOfMemoryError: java heap space" while compiling MonoDroid App in MonoDevelop 【发布时间】:2012-11-11 11:23:39 【问题描述】:

当我尝试编译(不执行)我的一个项目时,我最近收到以下错误:

Tool /usr/bin/java execution started with arguments: -jar /Applications/android-sdk-mac_x86/platform-tools/lib/dx.jar --no-strict --dex --output=obj/Debug/android/bin/classes.dex obj/Debug/android/bin/classes /Developer/MonoAndroid/usr/lib/mandroid/platforms/android-8/mono.android.jar FlurryAnalytics/Jars/FlurryAgent.jar Jars/android-support-v4.jar 

    UNEXPECTED TOP-LEVEL ERROR:
    java.lang.OutOfMemoryError: Java heap space
        at com.android.dx.rop.code.RegisterSpecSet.<init>(RegisterSpecSet.java:49)
        at com.android.dx.rop.code.RegisterSpecSet.mutableCopy(RegisterSpecSet.java:383)
        at com.android.dx.ssa.LocalVariableInfo.mutableCopyOfStarts(LocalVariableInfo.java:169)
        at com.android.dx.ssa.LocalVariableExtractor.processBlock(LocalVariableExtractor.java:104)
        at com.android.dx.ssa.LocalVariableExtractor.doit(LocalVariableExtractor.java:90)
        at com.android.dx.ssa.LocalVariableExtractor.extract(LocalVariableExtractor.java:56)
        at com.android.dx.ssa.SsaConverter.convertToSsaMethod(SsaConverter.java:50)
        at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:99)
        at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:73)
        at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:273)
        at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:134)
        at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:87)
        at com.android.dx.command.dexer.Main.processClass(Main.java:487)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459)
        at com.android.dx.command.dexer.Main.access$400(Main.java:67)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398)
        at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
        at com.android.dx.command.dexer.Main.processOne(Main.java:422)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333)
        at com.android.dx.command.dexer.Main.run(Main.java:209)
        at com.android.dx.command.dexer.Main.main(Main.java:174)
        at com.android.dx.command.Main.main(Main.java:91)

其他项目按预期构建。我想我需要增加这个 java 构建步骤的堆大小?但是怎么做呢?

【问题讨论】:

您在应用中使用了许多大尺寸图片? 应用中没有大图。请注意,这是一个编译时错误,与在设备上执行应用程序无关。 【参考方案1】:

Xamarin Studio 中有一个选项可以增加 Java 堆大小。

项目选项 -> Android 构建 -> 高级 -> Java 堆大小。

【讨论】:

我使用这个 UI 设置已经有一段时间了。比导出 _JAVA_OPTIONS 好多了! 这里放什么值? 好的,1G 对我来说已经足够了。 在 Visual Studio 中,这是在项目属性/Android 选项/高级选项卡上。 注意选择的配置。在上图中,选择了 Debug 配置,请确保同时更改 Release 的值,以便您的发布版本也使用增加的值。【参考方案2】:

This suggestion 成功了:

$ export _JAVA_OPTIONS="-Xmx1g"
$ /Applications/MonoDevelop.app/Contents/MacOS/MonoDevelop

我的项目中有一些 jar 文件。 Flurry、Maps 和 Newtonsoft... 显然这足以轰炸构建。

感谢出色的 Xamarin 支持团队的快速响应并指出解决方案!他们正在努力减少外部 jar 所需的内存占用。

【讨论】:

以上是关于如何在 MonoDevelop 中编译 MonoDroid App 时修复“OutOfMemoryError: java heap space”的主要内容,如果未能解决你的问题,请参考以下文章

Scala Future monod 中的 onComplete 方法

灵敏度分析方法_以monod方程为例

如何在 MonoTouch / MonoDevelop / UIBuilder 中插入插座?

如何在 Ubuntu 上的 MonoDevelop 中使用 System.Windows.Forms?

如何在 Linux 下使用 MonoDevelop 的项目中使用 Console.ReadLine()

Monodevelop 不会在 Mint 17 中启动