Java из-за ошибок памяти на больших WSDL (игровая среда) - PullRequest
2 голосов
/ 09 марта 2012

У нас возникла проблема при попытке сгенерировать и использовать действительно большой прокси-файл (для справки - из MSCRM Dynamics WSDL). Прежде чем я вернусь к вопросу: у нас это уже работает в автономном приложении, использующем NetBeans. Мы сгенерировали все прокси-файлы, используя «WSDL2Java -uri и т. Д.». Познакомился с некоторыми из веб-методов и успешно получил ответы и т.д.

Теперь, когда мы пытаемся интегрировать его в целевой проект в eclipse (запущенном через play framework), он выдает ошибки из памяти. Это происходит еще до того, как я попытаюсь позвонить на любой веб-сервис. Я читал о проблемах с памятью в Play Framework и Axis2, но пока не нашел решения этой проблемы. Я пытался поднять память при игре, но это не помогло. Я работаю на Windows, но, несмотря на то, что у меня 64-битная ОС, кажется, можно выделить только 1,5 ГБ для пространства кучи воспроизведения:

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, я проверил / изменил следующее, чтобы увидеть, помогает ли это:

Во-первых, используя сообщение Как узнать, запущен ли я в 64-битной JVM или 32-битной JVM (изнутри программы)? , я запустил следующее, чтобы убедиться работает 64 бит JDK:

java -d64 -version

Который не выдал никаких ошибок. Затем я попытался изменить настройки памяти в Eclipse следующим образом:

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

Перезапустил затмение и повторил попытку. К сожалению, та же проблема все еще существовала.

Наконец, я попытался ввести уменьшенное кэширование на wsdl, используя конфигурацию Axis2. Изменен Axis2.xml для включения следующего:

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

К сожалению, та же проблема сохраняется.

Ответы [ 3 ]

3 голосов
/ 15 февраля 2016

Простая вещь, которую мы можем сделать, это увеличить размер кучи .

Перейти к: ApacheCXF / bin и отредактировать wsdl2java.bat, если это версия для Windows.

Измените -Xmx128M на -Xmx2048M

Наконец перезапустите командную строку в режиме администратора и выполните команду ниже

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

2 голосов
/ 16 марта 2012

Хорошо, после большого количества исследований я разобрался, как решить эту проблему.

По сути, динамика - это огромный wsdl-флиппин, так что это приводит к огромному файлу-заглушке.Так что я подумал, есть ли способ разбить этот файл на более мелкие части?Перед тем, как приступить к выполнению крупной ручной задачи по обработке файла-заглушки, я провел небольшое исследование Axis2 и инструмента WSDL2Java.В результате я обнаружил одну важную вещь: ADB против 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 не может быть решен .

В любом случае,Я следовал этому руководству, и оно сняло все проблемы с памятью, и теперь у меня есть связь с динамикой.Полученный код немного неуклюжий по сравнению с тем, что предоставляет вам АБР, но он работает, и это все, что имеет значение!

Спасибо за все комментарии, они подтолкнули меня в правильном направлении к решению этой проблемы.

0 голосов
/ 31 мая 2015

Я столкнулся с проблемой нехватки памяти из-за большого файла, созданного утилитой WSDL2Java, Axis2 предоставляет опцию -u для создания нескольких классов вместо одного файла.

Источник: Axis2 WSDL2java генерирует только 2 класса Java

...