有効期間リース

参照渡しのマーシャリング (MBR: Marshal-By-Reference) オブジェクトは、サーバー側でアクティブ化される Singleton オブジェクトであっても、クライアント側でアクティブ化されるオブジェクトであっても、永久にメモリに常駐することはありません。代わりに、それぞれの MBR には、型がそれ自身の有効期間ポリシーを制御するために MarshalByRefObject.InitializeLifetimeService をオーバーライドしない限り、リース、リース マネージャ、およびいくつかのスポンサーの組み合わせによって制御される有効期間が設定されます。この場合、MBR オブジェクトの有効期間とは、そのオブジェクトがメモリ内でアクティブである合計時間です。リースとは、.NET Framework リモート処理システムがオブジェクトを削除してメモリを再利用する処理を開始する前の、特定のオブジェクトがメモリ内でアクティブである期間のことです。サーバー アプリケーション ドメインのリース マネージャは、リモート オブジェクトをガベージ コレクションの対象としてマークするタイミングを決定するオブジェクトです。スポンサーは、自らをリース マネージャに登録することで、特定のオブジェクトの新しいリースを要求できるオブジェクトです。

MBR オブジェクトがアプリケーション ドメインの外部でリモート処理されると、そのオブジェクトに有効期間リースが作成されます。各アプリケーション ドメインには、そのドメイン内のリースを管理するリース マネージャが含まれています。リース マネージャは、すべてのリースについて期限が切れていないかどうかを定期的にチェックします。リースの期限が切れている場合、リース マネージャは、そのオブジェクトのスポンサー一覧に要求を送信し、リースの更新をコミットするスポンサーがあるかどうかを照会します。リースを更新するスポンサーがない場合は、リース マネージャがリースを削除し、オブジェクトが削除され、そのオブジェクトのメモリがガベージ コレクションによってクリアされます。スポンサーによって複数回更新されたり、クライアントによって継続的に呼び出されたりすると、オブジェクトの有効期間がその有効期間リースよりも大幅に長くなる可能性があります

リモート オブジェクトの有効期間は、そのクライアントの有効期間に依存しません。基本的なオブジェクトのリースが長期間であると、そのオブジェクトが複数のクライアントによって使用される場合があります。オブジェクトのリースがクライアントによって定期的に更新されると、オブジェクトが長期間維持されることになります。分散ガベージ コレクションに必要なネットワーク トラフィックはごくわずかであるため、この方法ではリースが効率的に使用されます。ただし、リソースをほとんど使用しないリモート オブジェクトのリースは有効期間が短く、クライアントがそのリースを短期間で頻繁に更新します。すべてのクライアントがリモート オブジェクトの処理を終了すると、.NET Framework リモート処理システムは、そのオブジェクトを直ちにガベージ コレクションの対象としてマークします。このポリシーによって、ネットワーク トラフィックを増大させずに、サーバー リソースをより効率よく使用できるようになります。

リースを使用してリモート オブジェクトの有効期間を管理する方法は、信頼性の低いネットワーク接続において複雑で非効率的になりがちな参照カウントに代わるものです。リースの構成によってはリモート オブジェクトの有効期間が必要以上に長くなる可能性がありますが、参照カウントやクライアントへの要求の送信に使用されるネットワーク トラフィックを削減できるため、特定のシナリオで適切にリースを構成すれば、優れた解決策となります。

リースの主要なプロパティを次の表に示します。

プロパティ 説明

InitialLeaseTime

リース マネージャがオブジェクトの削除処理を開始するまで、そのオブジェクトがメモリに保持される期間の初期値を指定します。構成ファイルでは、<lifetime> 要素 構成要素の leaseTime 属性がこれにあたります。既定値は 5 分です。リース時間を 0 にすると、無期限の有効期間が設定されます。

CurrentLeaseTime

リースが期限切れになるまでの期間を指定します。リースが更新されると、その CurrentLeaseTime は、CurrentLeaseTime または RenewOnCallTime の最大値に設定されます。

RenewOnCallTime

オブジェクトに対する各リモート呼び出しの後に CurrentLeaseTime に設定される最長時間を指定します。既定値は 2 分です。

SponsorshipTimeout

リースの期限が切れたことが通知された後に、リース マネージャがスポンサーの応答を待機する時間を指定します。指定した時間内にスポンサーが応答しない場合、そのスポンサーは削除され、別のスポンサーが呼び出されます。スポンサーが存在しなくなると、リースが期限切れになり、リモート オブジェクトがガベージ コレクションの対象としてマークされます。値を 0 にすると (TimeSpan.Zero)、リースはスポンサーを登録しません。既定値は 2 分です。

LeaseManagerPollTime

期限の切れたリースがあるかどうかを確認した後にリース マネージャがスリープする時間を指定します。既定値は 10 秒です。

リースは、別のアプリケーション ドメインで MBR オブジェクトがアクティブになったときに作成されます。この時点で ILease.CurrentState プロパティが LeaseState.Initial である場合は、リースのプロパティを設定できます。一度設定したプロパティは、直接変更できません。CurrentLeaseTime だけは、ILease.Renew 呼び出しから変更するか、またはリース マネージャがスポンサーの ISponsor.Renewal を呼び出し、そのスポンサーが TimeSpan オブジェクトで応答するときに変更できます。MarshalByRefObject には、有効期間リースが既定で実装されており、作成時にこのリースが変更されない限り、リースのプロパティは常に同じです。

リースのプロパティの変更

有効期間リースのプロパティを変更するには、次の方法があります。

  • MBR オブジェクトの MarshalByRefObject.InitializeLifetimeService をオーバーライドしてカスタムの有効期間リース プロパティを宣言することで、リースのプロパティを自分で設定するか、または null 参照 (Visual Basic では Nothing) を返します。後者を選択した場合は、この型のインスタンスの有効期間が無期限であることが .NET Framework リモート処理システムに通知されます

  • 開発者または管理者は、特定のアプリケーションのすべてのオブジェクトの有効期間プロパティを、アプリケーション構成ファイルまたはコンピュータ構成ファイルの <lifetime> 要素 要素で指定することもできます。詳細については、「リースの初期化」を参照してください。

作成したリースは、次の方法で更新できます。

  • クライアントが Renew を直接呼び出します。

  • ILease.RenewOnCallTime プロパティが設定されている場合は、リモート オブジェクトが呼び出されるたびに、リースが指定した期間だけ更新されます。

  • リースが Renewal メソッドを呼び出してリースの更新を要求し、スポンサーが TimeSpan で応答します。

詳細については、「リースの更新」を参照してください。

リース マネージャ

リース マネージャは、リースの期限が切れていないかを定期的に調べる必要があります。リースの期限が切れている場合はリースに通知され、リースがそのスポンサーを呼び出して自らの更新を試みます。

リース マネージャは、リースが応答を待っているスポンサーの一覧も管理します。スポンサーは、SponsorshipTimeout で指定された時間内に応答しないと、スポンサーの一覧から削除されます。

悪意のあるリモート処理クライアントが、リース システムを悪用して、リモート処理サーバーにサービス拒否 (DOS) 攻撃を仕掛ける可能性があるので注意してください。悪意のあるクライアントは、多数のリースのスポンサーとなったうえで、サーバーの更新クエリに対する応答を拒否しますこの DOS 攻撃が可能になるのは、TypeFilterLevel が full に設定されている場合に限られます。

リースの有効期限が切れると、それ以降のリース メッセージやスポンサーの戻り値は受け入れられません。リースの参照はリースの一覧から削除され、.NET Framework リモート処理システムはその内部テーブルからオブジェクト参照を削除します。さらに、ガベージ コレクション システムによってリースとオブジェクトが削除されます。

関連項目

タスク

方法 : InitializeLifetimeService インターフェイスをオーバーライドする
方法 : リースを更新する

参照

リモート処理設定スキーマ
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService

概念

リモート処理の例 : 有効期間
リースの初期化
リースの更新

その他の技術情報

オブジェクトのアクティベーションと有効期間

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.