axis2+Tomcat8を使用してWEBサービスの開発を行っているのですが、
大容量のファイル転送を行うと、スケルトン側のクラスに到達する前に
以下のエラーで止まってしまいます。
Tomcatのメモリを増やすなどの対策はあるのかと思いますが、
そもそも、メモリ上にデータが全て展開されているといたちごっこになってしまうので、
根本的な解決方法がないかアドバイスをお願いいします。
lang
12015-02-08 17:29:11,176 ERROR org.apache.axis2.transport.http.AxisServlet - Java heap space 2java.lang.OutOfMemoryError: Java heap space 3 at com.ctc.wstx.util.TextBuffer.finishCurrentSegment(TextBuffer.java:911) 4 at com.ctc.wstx.sr.BasicStreamReader.readTextSecondary(BasicStreamReader.java:4751) 5 at com.ctc.wstx.sr.BasicStreamReader.readCoalescedText(BasicStreamReader.java:4126) 6 at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3701) 7 at com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3649) 8 at com.ctc.wstx.sr.BasicStreamReader.getText(BasicStreamReader.java:809) 9 at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.getText(XMLStreamReaderWrapper.java:164) 10 at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.getText(XMLStreamReaderWrapper.java:164) 11 at org.apache.axiom.util.stax.XMLStreamReaderUtils.writeTextTo(XMLStreamReaderUtils.java:287) 12 at org.apache.axiom.om.impl.llom.SwitchingWrapper.writeTextTo(SwitchingWrapper.java:419) 13 at org.apache.axiom.util.stax.XMLStreamReaderUtils.writeTextTo(XMLStreamReaderUtils.java:285) 14 at org.apache.axiom.util.stax.XMLStreamReaderUtils.getDataHandlerFromElement(XMLStreamReaderUtils.java:237) 15 at jp.dsri.www.edi_bp._2004.jedicos_xml.client_server.PutDocument$Factory.parse(PutDocument.java:651) 16 at jp.dsri.www.edi_bp._2004.jedicos_xml.client_server.JXMSTransferMessageReceiverInOut.fromOM(JXMSTransferMessageReceiverInOut.java:215) 17 at jp.dsri.www.edi_bp._2004.jedicos_xml.client_server.JXMSTransferMessageReceiverInOut.invokeBusinessLogic(JXMSTransferMessageReceiverInOut.java:37) 18 at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40) 19 at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114) 20 at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181) 21 at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172) 22 at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146) 23 at javax.servlet.http.HttpServlet.service(HttpServlet.java:644) 24 at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 25 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 26 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 27 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 28 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 29 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 30 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 31 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 32 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 33 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 34 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
2015.2.18
ソースを解析したところ、XMLパーサーで使用しているTextBuffer内で、読み込んだ要素をStringに
変換するところで発生していました。
lang
1char[] curr = new char[oldLen + (oldLen >> 1)];
※以下の場所でも落ちることがあります。
lang
1StringBuffer sb = new StringBuffer(segLen + currLen);
どちらも、<data>タグ内の要素をすべて変数に格納しようとして、メモリを使い切っているのですが、
今回のデータ構造として、Base64にされたバイナリ情報が連携される為、順次処理などで
出力しないと、どうやってもメモリ不足は回避できないと思っております。
どなたか、Axis2を使用してSOAPエンベロープ内の情報を順次処理でファイルなどに
出力する方法をご存じの方はいらっしゃいますでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/18 08:22