質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

axis2を用いたWebサービスでのOutOfMemoryError: Java heap space

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,259
axis2+Tomcat8を使用してWEBサービスの開発を行っているのですが、
大容量のファイル転送を行うと、スケルトン側のクラスに到達する前に
以下のエラーで止まってしまいます。
Tomcatのメモリを増やすなどの対策はあるのかと思いますが、
そもそも、メモリ上にデータが全て展開されているといたちごっこになってしまうので、
根本的な解決方法がないかアドバイスをお願いいします。
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に
変換するところで発生していました。
char[] curr = new char[oldLen + (oldLen >> 1)];
※以下の場所でも落ちることがあります。
StringBuffer sb = new StringBuffer(segLen + currLen);

どちらも、<data>タグ内の要素をすべて変数に格納しようとして、メモリを使い切っているのですが、
今回のデータ構造として、Base64にされたバイナリ情報が連携される為、順次処理などで
出力しないと、どうやってもメモリ不足は回避できないと思っております。

どなたか、Axis2を使用してSOAPエンベロープ内の情報を順次処理でファイルなどに
出力する方法をご存じの方はいらっしゃいますでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

あまり詳しく知りませんが、大容量ファイル転送を行うための仕組みを導入する必要があると思います。

下記ページが参考になるかもしれません。
Web サービスを開発する: 第 3 回 Apache CXF を使用してファイル・アップロード Web サービスを開発する

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/18 17:22

    >argiusさん
    情報提供ありがとうございます。
    ソースをさらに調査したところ、Axis2がXMLパースに使用しているライブラリ(wstx-asl-3.2.9.jar)
    の中で、タグ要素をStringに変換する所で落ちているようです。
    今回の要件として、<data>タグ内にBase64化された実データを連携しないといけないため、教えていただいたページでのバイナリー添付ファイルとして連携するという対応は厳しい状態です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る