OutOfMemory例外への対応

a photo of a group of people working

はじめに

本記事では、ワークフロー開発において発生しうるエラー:「Out of Memory」についての解説およびトラブルシュート方法をまとめます。

「Out of Memory」の原因は多岐にわたるため、適切なトラブルシュートが必要です。そうすることにより、原因の早期発見および解決につながります。

メモリ

OSのビット数およびアプリケーションのビット数の組み合わせにより、1つのアプリケーションが最大で利用できるメモリの領域が決まっています。

Out of memory

単純に、オンメモリでのデータ確保が上記の表にある上限を超える場合、ロジックの改変やOSの変更、もしくはメモリの増設が必要です。

Out Of Memory

Out Of Memoryはシステムが必要とするメモリを確保できない時に発生するエラーです。 システムがエラーを通知してくれる場合は良いですが、時としてシステムやPCのクラッシュにつながることがあり、原因特定が困難になる可能性があります。 「Out of Memory」が発生するときには、下記のいずれかを理由としているケースが多くあります。

  1. 必要なメモリが不足している。

  2. システムでメモリリークが発生している。

  3. メモリの断片化がおきており、十分なメモリを確保できない。

トラブルシューティング

「Out of Memory」エラーが発生した際には、1)状況判断 2)エラー発生場所の特定、が特に重要です。

1)状況判断:エラーがどのタイミングから発生しているか。再現性があるか。エラーの前後でシステムの変更がなかったか。など確認するとよいでしょう。

2)発生箇所特定:エラーの発生箇所を特定することが、エラーの早期解決につながります。発生箇所特定方法については後述します。

上記2点を調査することで、「Out of Memory」エラーの原因の切り分けをすることができます。

発生箇所の特定

ワークフローが原因である場合、発生箇所の特定には、下記の方法でさらに切り分けを行います。

原因と思われるワークフローに下記のようなメッセージをログとして埋め込み、発生箇所のアクティビティを特定します。発生箇所の特定のために、このようなログを複数箇所に配置すると良いでしょう。(プロセスモニタなどでメモリ変化量のモニタリングは可能ですが、ワークフローとの関連付けが難しいため、ワークフローと関連付けた上でメモリ変化量をモニタします。)

Out of memory

(#001を連番にするなど、ログ出力メッセージが、プロセス内の複数のログの中で一意となるようにしてください)

上記モニタの結果から、メモリが増加している箇所の特定をします。

可能性のある原因

可能性のある原因として、次のようなことが考えられます。

  • ループ内の処理で継続的にメモリの使用が増大するような変数やアクティビティの使用(例:DataTableへ連続的に行を追加)

  • イメージ関連アクティビティの使用

  • 変数の不適切なロード

  • UiPath Robotから、外部システムを呼び出しており、外部システムで大量のメモリを確保をしている

問題箇所の修正

問題箇所の特定後、ワークフローを修正します。ただし、問題は多岐にわたるため、ここではいくつかの例を提示します。

当該の箇所を、メモリ使用量の観点から最適化
  • 適切なアクティビティを使うように修正(例:【画像があるか確認】アクティビティを繰り返し呼び出すのではなく、【画像が出現したとき】アクティビティを使用するように変更)

  • ループ内での画像データ使用を最適化、ロード回数を減らす(例:ループ前に画像を変数に代入し、ループ内では変数を利用)

  • 使用終了後の画像データをすみやかに破棄(方法は下記Aを参照)

  • ガベージコレクタ(GC)を明示的に呼び出す(方法は下記Bを参照)

A) 使用終了後の画像データをすみやかに破棄するには、下記の通り、読み込んだ画像の変数(例:image)を明示的にDisposeさせることで実施できます。

Out of memory

B) GCを明示的に呼び出すためには、下記のコードを実行します。

Out of memory

上記により、

  1. アクセス不可能なオブジェクトを除去

  2. ファイナライゼーションが終わるまでスレッド待機(WaitForPendingFinalizers)

  3. ファイナライズされたばかりのオブジェクトに関連するメモリを開放

が実施されます。

新しいアクティビティパッケージを使う

パッケージバージョンの変更により、メモリ処理に関しての最適化が行われている可能性もあるため

以上です。