リソースの解放洩れ

Visual LANSA

リソースの解放洩れ


Windowsアプリケーションのリソースの使い方に関しては、ウィンドウを閉じてもこれに割り当てられたリソースがすべて解放されず、再利用できなくなってしまう、という問題がよく起こります。これは「リソースの解放洩れ」と呼ばれます。そのままアプリケーションを使い続けると、必要なリソースを獲得できず、異常停止など予期しない状態に陥る恐れがあります。これを回避するため、VLFには高レベルのリソースの解放洩れのうちいくつかの要因を追跡する、簡単な診断ツールが付属しています。

この機能を有効にするためには、VLFを設計者として実行する必要があります。

サブ・フレームワーク・ウィンドウを開き、次にそれを閉じたとき、次のようなメッセージが表示されたとすれば、リソースの解放洩れをVLFが検出したことになります。

これは、ウィンドウを閉じる際、VLコンポーネント(この場合はDF_DET1というコマンド・ハンドラー・インスタンス)を破棄しなかったことを表します。

すなわち、DF_DET1に「解放洩れ」リソースが残っているということです。原因を突き止め、修正しなければなりません。なぜこのメッセージが表示されたのか分からない場合は、Visual LANSAに詳しい専門家に、VLアプリケーションの設計について相談してください。

小〜中程度の複雑さのVLFアプリケーションの場合、このメッセージが表示されることはそう多くないでしょう。しかしVLF/VLアプリケーション・コンポーネントに凝った仕組みを組み込んでいくと、問題が発生する可能性が高くなります。

よくある原因として、「循環参照」と呼ばれるものがあります。あるVLコンポーネント(例えばコマンド・ハンドラー「A」)が別のオブジェクト(例えば再利用可能パーツ「B」)を参照し、逆にこの「B」も「A」を参照している、という状況です。

これは比較的単純な状況ですが、参照関係がもっと複雑に絡み合っている場合もあります。コンポーネント「A」が「B」を参照し、「B」が「C」、「C」が「D」と順次参照し、一周して「D」が「A」を参照している、というような状況です。このように経路が長くなっても、「循環」しているという意味では同じです。

循環参照を避けるためには、次のような点に注意するとよいでしょう。

·         Reference(*Dynamic)変数やオブジェクト参照コレクションで、BEGIN_COM/END_COMブロックをまたがる(すなわちVLプログラムをまたがる)ようなものは、できるだけ使わない

·         どうしても必要であれば、処理構造に従い、適切にオブジェクト参照を削除する/NULL参照を設定するよう実装する

·         Scope(*Application)変数やコレクションを使ってオブジェクト参照を追跡する場合、処理構造に従い、適切なタイミングで参照を再削除するよう実装する

簡単に言うと次のようになります。「A」というオブジェクト・インスタンスの参照を、変数またはコレクションに格納しているとしましょう。ここで「A」を破棄する場合、これを参照しているオブジェクトすべてについて、事前にその参照を解除しなければなりません。そうしない限り、「A」は「どこかから参照されている」ことになるので、決してリソースが解放されることはないのです。

重要な免責事項:VLFは診断ツールに過ぎません。リソースの解放洩れを追跡できるのは、VLF実行環境で、管理対象として「既知」となっているオブジェクトに限ります。高度なVLFアプリケーションでは、VLF実行環境の管理外で多くのオブジェクトを生成、破棄する場合がありますが、これは追跡できません。先に示したようなメッセージ・ボックスが表示されなくても、リソースの解放洩れがないという証明にはならないのです。