在Eclipse中无法执行dex:GC超过限制

213

当我下载了Git项目OsmAnd并尝试编译时, Eclipse报告了以下错误:

[Dex Loader] Unable to execute dex: GC overhead limit exceeded
[OsmAnd]     Conversion to Dalvik format failed: 
             Unable to execute dex: GC overhead limit exceeded

根据Google和Stackoverflow的建议,我需要在eclipse.ini中更改-Xms40m -Xmx384m参数配置。 Conversion to Dalvik format failed: Unable to execute dex: Java heap space。 我尝试了清理项目并重新启动Eclipse,但没有起到作用。

我找到了这个链接:Tips for Android developer: “Conversion to Dalvik format failed: Unable to execute dex: null”,但我不知道要更改哪个.jar里的输入。 如果有人能帮助我,我可以将项目发送给他们。

9个回答

437

可以通过更改Eclipse.ini中的VM值来解决该问题。将下面的值设置为512和1024:

openFile
--launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m

图片中的变化区域 enter image description here


8
谢谢。我想知道为什么默认设置仍然是如此不足,我不认为有人使用少于512/1024的eclipse - 我甚至增加了两倍。此外,我希望这些设置被存储在我的主目录下的某个配置文件中,而不是一个在每次升级时都会被覆盖的ini文件中。 - Yashima
11
您是否需要两次使用 --launcher.XXMaxPermSize 512m - Andrew Wyld
4
这些数字的限制是什么?我应该考虑把它们放得有多高? - easycheese
5
这取决于你的操作系统以及你是否使用32位或64位的Java虚拟机。如果你使用64位的Java虚拟机,你可以将堆大小设置为小于RAM大小减去操作系统/其他应用程序开销的任何值。在32位的虚拟机上,你需要保持堆大小小于大约1500M(在Linux上)或1100M(在Windows上),因为虚拟机需要分配连续的地址空间,而对于32位应用程序来说,这是一个非常有限的资源。 - Jules
4
-XX:MaxPermSize=1024m -Xms1024m -Xmx2048m 帮助了。 - k4dima
显示剩余9条评论

24

以下步骤对我有用:

1) Open eclipse.ini file
2)changed
-Xms40m
-Xmx512m
to 
-Xms512m
-Xmx1024m

3)Restart eclipse

看这里


11
在 macOS 上,eclipse.ini 文件位于 Eclipse.app/Contents/MacOS/ 目录下。 - Ahmad Baraka

7

eclipse.ini看起来像这样。

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.200.v20140116-2212
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m
-Xmx1024m

5

假设这个问题是由于频繁打开Android XML文件引起的,因为你经常打开它。

以下两个StackOverFlow上的问题是相关的:

每次我在Eclipse中点击Android XML文件时,它都会加载所有API版本的数据

无法执行dex:GC超时限制已超过

我找到了另一个解决方案来解决这个问题,而不是增加VM值或降级到较旧的ADT版本(22.6.2或23.2)

注意:

一些旧的ADT版本不会每次打开时都加载XML,因此没有内存溢出导致第一个线程中讨论的GC超时限制已超过

解决方案:

在Eclipse底部会有一个垃圾桶符号,上面写着“运行垃圾回收器”。每当关闭一个Android的XML文件时,请务必点击“垃圾桶”或“运行垃圾回收器”以释放内存。这样可以防止工作空间因此类错误而崩溃:D
这可能是一个终极解决方案,因为如果您经常打开Android XML,特别是像我一样做很多UI工作,您无法将VM值增加到超过RAM限制。
希望这可以帮助来到这个线程的每个人:)
保持冷静并继续编码

1

我不知道这个解决方法背后的原因,但每次当以上所有方法都无效时,这个方法都对我有效。

不要从快捷方式或链接启动eclipse。始终从你的eclipse文件夹中的eclipse.exe打开它,即保存eclipse.ini的文件夹。

注意 - 我只在Linux上尝试过。


1

在12小时内尝试更改eclipse.ini文件后,我最终找到了正确的解决方案。在我的环境变量中有一个名为“_JAVA_OPTIONS”的变量,其值为“-Xmx512M”。将此值更改为与eclipse.ini相同的值(-Xmx4096M),我再次能够将我的项目导出为APK文件。


实际上这可能是一个非常重要的提示,您可以从系统变量中删除_JAVA_OPTIONS(使用快速环境编辑器),否则Proguard可能会因某种原因开始抱怨。非常感谢Viktor。 - Simon

1
1) Open eclipse.ini file
2)change
-Xms40m
-Xmx512m
to 
-Xms512m
-Xmx1024m
3)Restart eclipse

相同的eclipse.ini文件将位于Eclipse根路径下,例如:

C:\Users\username\Downloads\adt-bundle-windows-x86_64-20140702\eclipse\eclipse.ini

同一个文件也可以在Android Studio项目中找到:

C:\Users\username\AppData\Local\Android\sdk\tools\lib\monitor-x86_64\monitor(Type:Configuration settings)

1
为了避免这个令人烦恼的消息,我不得不按照以下方式更改我的配置:
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20120913-

144807
-product
com.android.ide.eclipse.adt.package.adtproduct
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
1024m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.6
-XX:MaxPermSize=256m
-Xms512m
-Xmx1024m

根据标记为正确的答案,更改


-XX:MaxPermSize=256m
-Xms512m
-Xmx1024m

并且:

--launcher.XXMaxPermSize
1024m

0
如果这些答案不起作用(对我来说没有用),那么试试这个方法:
1)在你的工作空间中复制一份.metadata文件夹。
2)在复制一份后,删除你的.metadata目录。
3)打开Eclipse并关闭Eclipse。
4)将你旧的.metadata文件夹中的plugins文件夹复制到新的.metadata文件夹中。
5)将所有项目重新导入到你的工作空间中。
6)保持冷静并继续编码!

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