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.
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.
Simple thing we can do is to increase heap size.
Go to : ApacheCXF/bin and edit wsdl2java.bat if its a windows version.
Finally restart command prompt in administrator mode and execute below command
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