2

We've got a problem when trying to generate and use a really large proxy file (For the record, it's from a MSCRM Dynamics WSDL). Before I get to the issue: we already have this working in a stand alone app using NetBeans. We generated all the proxy files using "WSDL2Java -uri etc etc". Poked at a few of the web methods and successfully got responses etc.

Now, when we try to integrate it into the destination project in eclipse (launched through play framework) it throws out of memory errors. This happens before I even try to make a call to any webservices. I've read about memory issues with Play Framework and Axis2, but haven't as of yet seen any solutions to the problem. I've tried upping the memory on play, but that didn't help. I'm running on windows, but even though I have a 64 bit OS can only seem to allocate 1.5gb to the play heap space:

play clean  
play run . -Xms1536m

I thought this would be enough, but alas no!

For reference the stack trace is:

 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

Any help or thoughts would be greatly appreciated!


Update 1

Following advice from FloppyDisk I've checked / changed the following to see if it helps:

Firstly, using the post How can I tell if I'm running in 64-bit JVM or 32-bit JVM (from within a program)?, I ran the following to ensure I'm running 64 bit jdk:

java -d64 -version

Which didn't throw any errors. Next I tried changing my memory settings in eclipse to the following:

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

Restarted eclipse and retried. Unfortunately the same problem still existed.

Finally, I tried introducing reduced caching on the wsdl using Axis2 config. Modified Axis2.xml to include the following:

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

Unfortunately, same problem persists.

Community
  • 1
  • 1
Conor Gallagher
  • 1,500
  • 2
  • 19
  • 42
  • What are your netbeans.conf and eclipse.ini java settings? If your JVM allocation in eclipse isn't high enough, it won't have enough space to load everything. – FloppyDisk Mar 09 '12 at 11:52
  • I'm not sure which settings are important in the eclipse.ini, but they were the default since installed. I tried upping all of them to 1024M to see if it affect it, but unfortunately not. NetBeans was installed only a week back and also has it's default settings. For me this seems to be: netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.zip.disableMemoryMapping=true" – Conor Gallagher Mar 09 '12 at 12:28
  • -Xmns & -Xmnx control the heap size in eclipse.ini. Also try editing the startup arguments for the project, when you run it, and try to pass in a larger space allocation. Are you running a 64 bit JDK? – FloppyDisk Mar 09 '12 at 12:58
  • I believe I'm running java 64 bit! Well, at least I ran this and it doesn't seem to complain so I presume it is: "java -d64 -version". In regards to the startup arguments I'm running this using "play run" so will project start up arguments in eclipse affect this? If so, where and what do I change in eclipse? I'm a little new to eclipse to be honest so still trying to find my way around! – Conor Gallagher Mar 12 '12 at 10:13
  • An extra note on this - I also found a setting called "reduceWSDLMemoryCache" in the axis2.xml settings. Tried turning this on to see if it helps but unfortunately not. Also - I've edited my post to reflect all the advice so far. – Conor Gallagher Mar 12 '12 at 11:14

3 Answers3

4

Simple thing we can do is to increase heap size.

Go to : ApacheCXF/bin and edit wsdl2java.bat if its a windows version.

Modify -Xmx128M to -Xmx2048M

Finally restart command prompt in administrator mode and execute below command

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

2

Ok, after lots of research I figured out how to resolve this.

Effectively, dynamics is a flippin enormous wsdl, so it results in a humongous stub file. So I got to thinking is there any way I could break this file down into smaller parts? Before embarking on a massive manual task of going through the stub file I did a bit of research on Axis2 and the WSDL2Java tool. This resulted in me finding out 1 major thing: 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

So, what I was using was ADB (which is probably perfect for reasonable sized WSDLS), but for my combination of libraries and frameworks what I really should use is XMLBeans. This resulted in another question on here (which I ended up answering myself due to my own stupidity!) org.apache.axiom.om.util.AXIOMUtil cannot be resolved.

Anyway, I followed that guide and it removed all of my memory issues and now I have a connection to dynamics. The resulting code is a bit more clunky compared to what ADB provides you with, but it's working, and that's all that matters!

Thanks for all the comments, they prodded me in the right direction towards solving this.

Community
  • 1
  • 1
Conor Gallagher
  • 1,500
  • 2
  • 19
  • 42
0

I was facing out of memory issue due to large file generated by WSDL2Java utility, Axis2 provides option -u to generate multiple classes instead of one file.

source: Axis2 WSDL2java is generating only 2 java classes

Community
  • 1
  • 1
Kavan
  • 569
  • 4
  • 21