Apache Axis 1.4 OutOfMemoryError: пространство кучи Java

У меня есть своеобразная проблема, которая внезапно возникла на стороне клиента, который использует Apache Axis 1.4 для выполнения запросов SOAP к веб-службе. Все работает ровно год. Размер ответов медленно растет с течением времени, и в последнее время я получаю довольно случайные OutOfMemoryError: Java heap space исключения при вызове. Верхняя часть трассы показана внизу. Это происходит примерно в 1/10 сделанных вызовов. Если это произойдет, и я поймаю исключение и просто повторю вызов, это сработает в 99 случаях из 100.

Когда я впервые увидел это, я, естественно, предположил, что максимальный размер кучи необходимо увеличить. Я использую Tomcat 6 и изменил предыдущую настройку -Xmx1024M на -Xmx2048M (на машине много оперативной памяти). Однако это ничего не изменило. Глядя на состояние Tomcat, кажется, что в куче достаточно места для размещения ответа SOAP. Проблема также не связана с доступным пространством PermGen.

Ошибка не связана со временем работы приложения, она может возникнуть сразу после запуска Tomcat. Следовательно, похоже, это не связано с общей нагрузкой на сервер.

У кого-нибудь есть идеи по этому поводу? Я имею дело с известной ошибкой в ​​Axis? Я обнаружил несколько случаев, когда люди получали исключение OutOfMemoryError при отправке огромных вложений по протоколу SOAP, однако это не то, чем я занимаюсь.

Я использую wrap/literal для веб-службы SOAP.

Exception in thread "Thread-6" java.lang.OutOfMemoryError: Java heap space
        at org.apache.axis.message.SAX2EventRecorder$objArrayVector.add(SAX2EventRecorder.java:254)
        at org.apache.axis.message.SAX2EventRecorder.newElement(SAX2EventRecorder.java:136)
        at org.apache.axis.encoding.DeserializationContext.pushNewElement(DeserializationContext.java:769)
        at org.apache.axis.message.SOAPHandler.startElement(SOAPHandler.java:94)
        at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1048)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:504)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2732)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:625)

person Marcus Johansson    schedule 07.04.2011    source источник


Ответы (1)


Судя по всему, проблема не в Axis. Вы пытались выполнить анализ памяти? С помощью такого инструмента, как Memory Analyzer Tool (MAT).

person mauhiz    schedule 07.04.2011
comment
Здравствуйте, спасибо за вклад. Я использовал jvisualvm для мониторинга использования памяти, и на экземпляры объектов, связанных с Axis, приходится большая часть потребления памяти. Однако, учитывая, что размер ответа за последние месяцы увеличился лишь небольшими порциями и что удвоение доступной кучи не решает проблему, маловероятно, что фактическая нехватка кучи является реальной проблемой. Кроме того, если бы это было так, я нахожу очень странным, что это работает 9 раз из 10, и что все работает сразу после повторной попытки после того, как ошибка проявляется. - person Marcus Johansson; 07.04.2011
comment
Еще немного информации, я нашел это: issues.apache.org/jira/browse/AXIS- 2749, и моя ситуация очень похожа — т. е. это поток, который многократно десериализует ответ SOAP. - person Marcus Johansson; 07.04.2011
comment
@MarcusJohansson, вы нашли какое-нибудь решение этой проблемы? Я работаю над устаревшим приложением, мы все еще используем ось 1.4. - person prasadg; 02.07.2019