フローサービスでのメモリ不足について

フローサービスでメモリ不足が発生すると以下のいずれかまたは両方のメッセージがFlowService.logに出力されます。

java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: GC overhead limit exceeded

このメッセージは、フローを実行するプロセスであるFlowServiceがメモリ不足となり、処理に利用するメモリを確保できなかったことを示すものです。

FlowServiceのメモリ解放は、JVM内部のメモリ管理機能であるガベージコレクション(Garbage Collection:GC)を利用しています。GCは実行時にヒープ内のオブジェクトが必要かどうかを判断して不要なオブジェクトのメモリ領域を解放します。
詳しくはFAQ「フローサービスのメモリ解放(Garbage Collection)について教えてください」を参照してください。
「GC overhead limit exceeded」は、ガベージコレクションの限界を超えた、つまりGCが既定の時間内に終わらなかったことによるものです。

メモリ不足(OutOfMemoryError)が発生した状態になると、FlowServiceがメモリ不足で動作が不安定な状態となり、プロセスが異常終了する可能性があります。メモリ不足が発生しないように処理するデータ量を考慮して余裕を持ったサイジングを行うと共に、フローの実行に使用可能なメモリリソースを十分に考慮してフローを作成してください。使用するメモリの問題のため、ASTERIA Warpのバージョンアップでは解決できません。

FlowServiceのメモリ使用状況を確認する

FlowServiceのメモリ使用状況を確認するには、フローサービス管理コンソールのグラフ画面またはfsmonコマンドを使用します。「OutOfMemoryError」のメッセージが出力された時間帯のメモリ使用状況を確認してください。

fsmonコマンドの使い方については、フローサービスマニュアルの「運用ガイド」-「稼働監視」-「モニターツール」を参照してください。
管理コンソールのグラフ画面については、フローサービス管理コンソール オンラインヘルプの「グラフ」を参照してください。

メモリ不足の対策

メモリ不足への主な対策としては、次の3点があげられます。

1. 最大メモリサイズ(最大ヒープ領域)を変更する

フロー管理コンソールの「設定」-「サービス」-「起動」の「最大メモリサイズ」に設定する値を大きくすることによりメモリ不足が改善される可能性があります。ただし、サーバーに搭載する物理メモリサイズやOS等の上限などによって設定可能な値に限界があるため、不用意に大きな値を設定しないよう注意が必要です。

詳しくはFAQ「フローサービスで使用するメモリの最大サイズを設定するときの注意点は?」を参考にしてください。

2. フローの処理ロジックを変更する

実際に作成されるフローの処理内容やフローの稼働状況などは多岐に渡るため、具体的な処理ロジックを提示することはできませんが、次のようなことを確認してください。

  • レコード単位で処理が可能な場合は、1レコードずつループ処理をすることで、メモリ消費を抑制することができます。コンポーネントの「ループを開始」プロパティに「はい」を設定すると、1レコード(または複数レコード)ずつループ処理をすることができます。RDBGetコンポーネントでループ処理をする方法やRecordGetコンポーネントを使用する方法が特に有効です。
  • ループ処理の終了がEndResponseコンポーネントやLoopEndコンポーネントの場合、「出力形態」プロパティに「ストリームをまとめる」を設定すると、ループで少量ずつ扱っていたデータが全てまとめられるため、メモリ消費が大きくなります。後続のコンポーネントでストリームを扱う必要がなければ、「出力形態」プロパティに「最後のストリーム」を設定してください。
  • フローの終了でレスポンスを返す必要のないフローであれば、フローの終了コンポーネントをEndResponseではなくEndで終了するようにするとメモリ上に出力が保持されないようになります。

フローサービスマニュアルの「運用ガイド」-「パフォーマンス」-「パフォーマンスチューニング」-「フローのチューニング」も参考にしてください。

3. 読み込むデータサイズを見直す

データベース、ファイル、メール、FTP、HTTPなどによりフローが読み込む、または受信するデータサイズが大きいとメモリ不足が発生しやすくなります。コンポーネントで1度に読込むデータサイズを見直して処理ロジックを変更するなど工夫してください。

※コンポーネント利用時の制限として、ファイルサイズが2GBを超えるファイルを処理することはできません。
※データベースの場合、1つのコンポーネントで読み込む件数が数千、数万単位になるとメモリが大量に必要になります。使用されるメモリは、サーバーに搭載された物理メモリサイズやOS等の上限、フローサービスに設定した最大メモリサイズなどに依存するため件数による制限はありませんが、コンポーネントで1度に読込む件数を見直してください。

FAQ

ガベージコレクションログを出力することはできますか?

メモリ不足が発生したときに管理者へ通知することはできますか?

64bit版フローサービスで使用するメモリの最大サイズに上限はありますか?

フローサービスでどのフローのメモリ使用量が高いかを特定できますか?

「Could not reserve enough space for object heap」というメッセージが出力されて起動できません

この記事は役に立ちましたか?
1人中1人がこの記事が役に立ったと言っています

他のキーワードで検索する