共用方式為


存留使用期

Marshal-by-reference 物件 (MBR) 不會永遠位在記憶體中 (無論是伺服器啟動的 Singleton 物件還是用戶端啟動的物件)。而是,除非型別會覆寫 MarshalByRefObject.InitializeLifetimeService 以控制它自己的存留期原則,否則每個 MBR 的存留期都會由使用期、使用期管理員和一些發起者的組合共同控制 (在這種情況下,MBR 物件的存留期就是該物件在記憶體中的總作用時間)。使用期是 .NET Framework 遠端處理系統開始刪除特定物件並回收記憶體的處理序之前,該物件在記憶體中的作用期間。伺服器應用程式定義域的使用期管理員,是決定何時將遠端物件標記為進行記憶體回收的物件。發起者是向使用期管理員註冊它自己,以要求特定物件使用新使用期的物件。

每當在應用程式定義域外遠端處理 MBR 物件時,就會建立該物件的存留使用期。每個應用程式定義域都包含使用期管理員,負責管理其定義域內的使用期。使用期管理員會定期檢查所有使用期的到期使用時間。如果使用期到期,則使用期管理員會將要求傳送給它內部關於該物件的發起者清單,並查詢它們之中是否有發起者認可要更新該使用期。如果沒有發起者更新使用期,則使用期管理員會移除該使用期、刪除該物件,並透過記憶體回收將該物件的記憶體回收。因此,如果發起者更新了數次或用戶端一再呼叫,則物件的存留期可以比它的存留使用期還長。

因為遠端物件的存留期與其用戶端的存留無關,所以簡單或輕量型物件的使用期可能會很長、可供多個用戶端使用,且系統管理員或用戶端會定期更新。因為進行分散式記憶體回收時需要極少的網路流量,所以這個方式會有效率地使用使用期。不過,使用了稀有資源的遠端物件會有存留期較短的使用期,這是因為用戶端經常會使用較短的時間範圍更新它。當所有用戶端都使用完遠端物件時,.NET Framework 遠端處理系統會快速刪除該物件。這個原則會減少增加的網路流量,並讓伺服器資源的運用更有效率。

使用使用期以管理遠端物件的存留期,是參考計數的一種替代方式,參考計數很複雜,而且在不穩定的網路連接上會沒有效率。雖然可以設定使用期,以將遠端物件的存留期延長到比實際需要的存留期還長,但是在針對特定案例適當設定時,減少用於參考計數和傳送要求到用戶端的網路流量這一項優點,讓使用期成為一項吸引人的方案。

下表描述使用期的主要屬性。

Property 描述

InitialLeaseTime

指定使用期管理員開始刪除物件的處理序之前,物件保留在記憶體中的初始時間範圍。在組態檔中,這是 <lifetime> 項目 組態項目的 leaseTime 屬性。預設為 5 分鐘。使用期是零會將使用期設定為無限存留期。

CurrentLeaseTime

指定使用期到期之前所剩下的時間範圍。更新使用期時,它的 CurrentLeaseTime 會設定為 CurrentLeaseTimeRenewOnCallTime 的最大值。

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) 攻擊。惡意用戶端會發起許多使用期,然後拒絕回答伺服器的更新查詢。只有在 TypeFilterLevel 是設定為 full 時,才可能發生這個 DOS 攻擊。

當使用期獲准到期時,就不會再接受任何進一步的使用期訊息或發起者傳回。使用期的參考會從使用期清單中移除,而 .NET Framework 遠端處理系統會從其內部表格中移除物件參考。然後,記憶體回收系統就會移除使用期和物件。

請參閱

工作

如何覆寫 InitializeLifetimeService 介面
如何更新使用期

參考

遠端設定結構描述
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService

概念

遠端處理範例:存留期
初始化使用期
更新使用期

其他資源

物件啟動和存留期