2011-08-16 137 views
5

你有什么想法,为什么我可以得到一个'线程中的异常'主要“java.lang.OutOfMemoryError:Java堆空间'错误时,构建我的android应用程序,即使我添加了-vmargs -Xmx1024M -Xms512M到eclipse的参数? 我想知道在构建时会发生什么样的错误会触发这样的错误,因为在我看来,只有Eclipse或Maven中的错误才能在构建时产生这样的错误。 我使用run作为maven install来构建我的应用程序(使用maven android eclipse插件)。运行as->'maven package'也会在等待大约1分钟30后产生相同的构建失败。 我有一台带有3GB内存的台式电脑,而我的应用程序几乎没有那么大。java堆空间

谢谢。

+0

你在你的应用中使用了任何位图功能吗? –

+0

是的,他是,我是 – Moussa

回答

8

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/some/path添加到您的jvm参数中,以便在内存不足时将其转储出堆。然后,您可以使用Eclipse Memory Analyserjhat浏览堆并诊断问题出在哪里。

更新:尝试增加你的maven android插件的内存。在你pom.xml,为Xmx JVM添加一个参数插件配置:

<plugin> 
    <artifactId>maven-android-plugin</artifactId> 
    <configuration> 
    <jvmArguments> 
     <argument>-Xmx1500m</argument> 
    </jvmArguments> 
    </configuration> 
</plugin> 
+0

对不起,我无法设法转储堆。这些参数是否应该插入到与eclipse中'run configuration'的'VM arguments'文本框相同的位置,如下所示:-Xms1024M -Xmx1024M -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath =“C:”? – John156

+0

@ John156看到我的更新增加内存的插件 – dogbane

+0

噢,我的上帝,非常感谢你!我一直在努力解决这个问题。我可以简单地解释为什么这会起作用,为什么它们使用单​​独的jvms,为什么调用进程(eclipse,jre,...)的参数不会自动设置为子进程? – John156

2

您的Eclipse JVM参数并不重要。你必须增加编译器的堆。

我引述http://javahowto.blogspot.com/2006/06/fix-javac-java-lang-outofmemoryerror.html

If [...] you're running Eclipse, go into your "run As" dialog for your Build.xml and add -Xms256m -Xmx256m to the "VM Arguments" text box

+0

这太聪明了,以至于一段时间真的以为它会解决我的问题。我不知道eclipse的JVM与编译器的JVM不同。所以我们很清楚,我所做的就是点击运行箭头,然后运行配置,然后选择我的运行配置,然后进入JRE选项卡,在'VM arguments'空白文本框中添加'-Xms1024M - Xmx1024M',然后申请并运行。 这很不幸没有奏效,问题仍然是一样的。 – John156

+0

是的,因为我现在意识到您正在使用Maven的Android插件及其Eclipse集成。这意味着Eclipse编译器设置无关紧要,而是插件的设置。 –

0

如果增加没有响应,那么我建议你检查你写的每个类的行数。如果有很多对象试图对方法进行分区和/或将它们复制到新类中(如果一个或多个类具有3000多行),那么这可能是一个编译器问题。

1

我遇到过这种转换为Dalvik格式失败:无法执行dex:Java堆空间。增加eclipse.ini文件中的所有值都没有帮助。在我将ADT插件从12升级到16后,发生了这种情况。我在升级之前更改了指向我现有项目的Android SDK(从我以前的adt中连接的android sdks中将它们更改为android sdks这是连接到我的新adt),它解决了我的问题。希望这可以帮助。如果它可以帮助别人,请为此加1。