質問編集履歴

1 エラーの詳細についての調査結果の追記

whitehorse_1439

whitehorse_1439 score 7

2015/02/18 17:30  投稿

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

    23757 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Tomcat

    897 questions

    TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る