有効期間リース

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

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

リモート オブジェクトの有効期間はそのクライアントの有効期間には依存しないため、単純なオブジェクトや軽量オブジェクトのリースは、管理者やクライアントによって定期的に更新されるまでに非常に長期間にわたり、多数のクライアントによって使用される可能性があります。分散ガベージ コレクションに必要なネットワーク トラフィックはごくわずかなため、このアプローチではリースを効率的に使用できます。しかし、リソースをほとんど使用しないリモート オブジェクトのリースの有効期間は短く、クライアントは短期間のうちに頻繁に更新します。すべてのクライアントがそのリモート オブジェクトを使い終えると、.NET Framework リモート処理システムはそのオブジェクトをすぐに削除します。このポリシーは、ネットワーク トラフィックの増加を抑え、サーバー リソースをより効率的に利用できるようにします。

リースを使用したリモート オブジェクトの有効期間の管理は、ネットワーク接続の信頼性が低いと複雑で非効率的になりやすい参照カウントに代わるアプローチです。リースは、リモート オブジェクトの有効期間を必要以上に長くするように構成される可能性がありますが、参照カウントやクライアントへの要求の送信に使われるネットワーク トラフィックを減らすことができるため、特定のシナリオに対して正しく構成すれば、魅力的なソリューションになります。

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

プロパティ 説明

InitialLeaseTime

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

CurrentLeaseTime

リースが期限切れになるまでの期間を指定します。リースが更新される場合、その CurrentLeaseTimeCurrentLeaseTime または 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

概念

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

その他の技術情報

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