为什么xalan.jar在部署Android应用程序时会崩溃

时间:2013-01-20 22:35:11

标签: android eclipse out-of-memory xalan

我正在开发一个运行在Windows 7 64bit(8GB ram)上的Eclipse Juno的Android应用程序所以我有我的android项目,我在/ lib文件夹中放置了一些jar文件,所以我可以在我的应用程序中使用它们。这很好,直到我添加xalan.jar文件,这是一个apache xml解析器的依赖项。

当我尝试从eclipse运行/部署我的应用程序以便它可以在我的手机上运行时,我开始在控制台中看到编译器警告抱怨来自xalan.jar的类,然后Eclipse崩溃并带有内存不足的堆空间异常。

!ENTRY com.android.ide.eclipse.adt 4 0 2013-01-20 21:04:37.427
!MESSAGE Unable to execute dex: Java heap space
!STACK 0
java.lang.OutOfMemoryError: Java heap space
    at com.android.dx.ssa.SsaBasicBlock.getRopLabelSuccessorList(SsaBasicBlock.java:393)
    at com.android.dx.ssa.back.SsaToRop.convertBasicBlock(SsaToRop.java:299)
    at com.android.dx.ssa.back.SsaToRop.convertBasicBlocks(SsaToRop.java:260)
    at com.android.dx.ssa.back.SsaToRop.convert(SsaToRop.java:124)
    at com.android.dx.ssa.back.SsaToRop.convertToRopMethod(SsaToRop.java:70)
    at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:102)
    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 sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.android.ide.eclipse.adt.internal.build.DexWrapper.run(DexWrapper.java:187)
    at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeDx(BuildHelper.java:745)
    at com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder.build(PostCompilerBuilder.java:598)
    at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:321)
    at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:396)
    at org.eclipse.core.internal.resources.Project$1.run(Project.java:618)

我尝试在线搜索,但我发现的最接近的事情是stackoverflow问题Eclipse crashing, getting heap exceptions - Out of Memory when trying to deploy an Android applicaiton,它指示增加堆空间内存。我从256m到1024做了什么,我仍然得到错误。

我删除了xalan.jar,一切都正常部署。这有什么解决方案吗?

------------ EDIT -------------

将最大内存更新为2048后

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at com.android.dx.util.IntList.<init>(IntList.java:87)
    at com.android.dx.rop.code.RopMethod.calcPredecessors(RopMethod.java:174)
    at com.android.dx.rop.code.RopMethod.labelToPredecessors(RopMethod.java:95)
    at com.android.dx.ssa.SsaBasicBlock.newFromRop(SsaBasicBlock.java:158)
    at com.android.dx.ssa.SsaMethod.convertRopToSsaBlocks(SsaMethod.java:174)
    at com.android.dx.ssa.SsaMethod.newFromRopMethod(SsaMethod.java:104)
    at com.android.dx.ssa.SsaConverter.convertToSsaMethod(SsaConverter.java:45)
    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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.android.ide.eclipse.adt.internal.build.DexWrapper.run(DexWrapper.java:187)
    at com.android.ide.eclipse.adt.internal.build.BuildHelper.executeDx(BuildHelper.java:745)
    at com.android.ide.eclipse.adt.internal.build.builders.PostCompilerBuilder.build(PostCompilerBuilder.java:598)
    at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:728)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)

2 个答案:

答案 0 :(得分:1)

我找到了一些确定的东西。来自www.xom.nu:

  

Java 1.3及更早版本没有内置的XML解析器,因此在这些环境中,您还需要安装XOM的支持库。这些包括xalan.jar, xercesImpl.jar,normalizer.jar和xml-apis.jar,可以在lib目录中找到。 XOM附带的版本比JDK捆绑的版本更快,更少,因此您甚至可能希望在Java 1.4及更高版本中使用它们。例如,

     

$ java -classpath xom-samples.jar:xom-1.1.jar:lib / xml-apis.jar:lib / xercesImpl.jar:lib / normalizer.jar:lib / xalan.jar nu.xom.samples。 PrettyPrinter filename.xml

     

如果你不使用nu.xom.xslt中的任何类,你可以省略xalan.jar。所有版本的Java都需要normalizer.jar。但是,它实际上只是由Serializer中的setUnicodeNormalizationFormC()方法使用。如果不调用此方法,则可以在空间有限的环境中省略此存档。 junit.jar仅用于测试,XOM的正常操作不需要。

所以请离开xalan.jar。 Android的本机javax.xml.transform已经完成所有工作(从API 8开始)。

顺便说一句,看起来你也可以放弃其他一些罐子。

答案 1 :(得分:0)

此错误可能是由JVM的默认Eclipse配置引起的。 确保为JVM堆添加更多空间。

-Xms512M -Xmx2048M

以下是有关如何完成此操作的一些参考资料

http://edwards.sdsu.edu/research/index.php/daniel/236-increasing-heap-size-in-eclipse

http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F

另外,请仔细检查您的ADT插件和Android SDK工具是否已更新。