大型WSDL上的Java内存不足错误(播放框架)

时间:2012-03-09 11:12:55

标签: java wsdl playframework axis2 out-of-memory

我们在尝试生成和使用非常大的代理文件时遇到了问题(对于记录,它来自MSCRM Dynamics WSDL)。在我遇到这个问题之前:我们已经使用NetBeans在一个独立的应用程序中工作了。我们使用“WSDL2Java -uri etc etc”生成了所有代理文件。探讨了一些网络方法并成功获得了回应等。

现在,当我们尝试将它集成到eclipse中的目标项目(通过播放框架启动)时,它会抛出内存错误。这种情况发生在我甚至尝试调用任何Web服务之前。我已经阅读了Play Framework和Axis2的内存问题,但还没有看到任何问题的解决方案。我试着在游戏中增加内存,但这并没有帮助。我在Windows上运行,但即使我有64位操作系统似乎只能为播放堆空间分配1.5gb:

play clean  
play run . -Xms1536m

我认为这就足够了,但是不行!

作为参考,堆栈跟踪是:

 An unexpected error occured caused by exception OutOfMemoryError: Java heap space

 play.exceptions.UnexpectedException: Unexpected Error
         at play.Invoker$Invocation.onException(Invoker.java:244)
         at play.Invoker$Invocation.run(Invoker.java:286)
         at Invocation.HTTP Request(Play!) Caused by: java.lang.OutOfMemoryError: Java heap space
         at java.util.Arrays.copyOfRange(Unknown Source)
         at java.lang.String.<init>(Unknown Source)
         at java.lang.StringBuffer.toString(Unknown Source)
         at java.io.StringWriter.toString(Unknown Source)
         at org.apache.commons.io.IOUtils.toString(IOUtils.java:383)
         at play.libs.IO.readContentAsString(IO.java:60)
         at play.libs.IO.readContentAsString(IO.java:49)
         at play.vfs.VirtualFile.contentAsString(VirtualFile.java:178)
         at play.classloading.ApplicationClasses$ApplicationClass.refresh(ApplicationClasses.java:199)
         at play.classloading.ApplicationClasses$ApplicationClass.<init>(ApplicationClasses.java:191)
         at play.classloading.ApplicationClasses.getApplicationClass(ApplicationClasses.java:49)
         at play.classloading.ApplicationCompiler$2.acceptResult(ApplicationCompiler.java:266)
         at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:478)
         at play.classloading.ApplicationCompiler.compile(ApplicationCompiler.java:282)
         at play.classloading.ApplicationClassloader.getAllClasses(ApplicationClassloader.java:424)
         at play.Play.start(Play.java:505)
         at play.Play.detectChanges(Play.java:618)
         at play.Invoker$Invocation.init(Invoker.java:198)
         ... 1 more

非常感谢任何帮助或想法!


更新1

根据FloppyDisk的建议,我检查/更改了以下内容,看看是否有帮助:

首先,使用帖子How can I tell if I'm running in 64-bit JVM or 32-bit JVM (from within a program)?,我运行以下命令以确保我运行64位jdk:

java -d64 -version

哪个没有抛出任何错误。接下来我尝试将eclipse中的内存设置更改为以下内容:

-vmargs
-Xms512m
-Xmx1024m
-XX:MaxPermSize=512m

重启eclipse并重试。不幸的是,同样的问题仍然存在。

最后,我尝试使用Axis2配置在wsdl上引入简化缓存。修改了Axis2.xml以包含以下内容:

<parameter name="reduceWSDLMemoryCache">true</parameter>

不幸的是,同样的问题仍然存在。

3 个答案:

答案 0 :(得分:3)

我们可以做的很简单的事情是增加堆大小

转到:ApacheCXF / bin并编辑wsdl2java.bat(如果它是Windows版本。

  

将-Xmx128M修改为-Xmx2048M

最后在管理员模式下重启命令提示符并执行以下命令

  

wsdl2java -d src-cxf -b custom.xml -exsh true -autoNameResolution   -verbose ABC.wsdl

答案 1 :(得分:2)

好的,经过大量研究,我想出了如何解决这个问题。

实际上,动态是一个巨大的wsdl,所以它会产生一个巨大的存根文件。所以我想到有什么方法可以将这个文件分解成更小的部分吗?在开始执行存根文件的大量手动任务之前,我对Axis2和WSDL2Java工具进行了一些研究。这导致我找到了一个主要的东西:ADB vs XMLBeans

http://axis.apache.org/axis2/java/core/docs/userguide-creatingclients.html

http://axis.apache.org/axis2/java/core/docs/userguide-creatingclients-xmlbeans.html

所以,我使用的是ADB(这对于合理大小的WSDLS来说可能是完美的),但对于我的库和框架的组合,我真正应该使用的是XMLBeans。这导致了另一个问题(由于我自己的愚蠢,我最终回答了自己!)org.apache.axiom.om.util.AXIOMUtil cannot be resolved

无论如何,我遵循了该指南,它删除了我所有的记忆问题,现在我与动态有关。与ADB为您提供的代码相比,生成的代码更加笨拙,但它正在发挥作用,而这一切都很重要!

感谢所有评论,他们向我提出了解决问题的正确方向。

答案 2 :(得分:0)

由于WSDL2Java实用程序生成大文件,我面临内存不足问题,Axis2提供选项-u来生成多个类而不是一个文件。

源: Axis2 WSDL2java is generating only 2 java classes