Marshal-By-Reference 物件 (MBR),不論是伺服器啟動 Singleton 物件或用戶端啟動物件,都不會永遠常駐在記憶體中。除非型別覆寫 MarshalByRefObject.InitializeLifetimeService() 以控制它自己的存留期原則,不然每個 MBR 的存留期都會由使用期、使用期管理員和數個支援者的組合所控制 (在這種情況下,MBR 物件的存留期是記憶體中作用中物件的總時數)。使用期是指在 .NET 遠端處理系統開始進行刪除特定物件的程序並回收利用記憶體之前,該特定物件在記憶體中作用的那一段時間。伺服器應用程式定義域的使用期管理員,是決定遠端物件何時要標示為記憶體回收的物件。支援者則是利用使用期管理員註冊其本身,以便為特定物件要求新使用期的物件。
每當 MBR 物件在某一應用程式定義域之外進行遠端處理時,就會針對該物件建立存留使用期。每個應用程式定義域都包含一位負責管理其定義域內使用期的使用期管理員。使用期管理員定期檢查所有使用期的到期使用期時間。如果使用期到期,使用期管理員便會查核該物件的支援者清單,並查詢是否有任何支援者要更新使用期。如果沒有支援者要更新使用期,則使用期管理員會移除使用期、刪除物件並回收利用其記憶體。如果支援者不只更新一次或用戶端持續呼叫它,則物件的存留期可比它的存留使用期要長很多。
由於遠端物件的存留與其用戶端的存留無關,因此,簡易或輕量型物件的使用期,可由管理員或用戶端定期更新,保持十分長的期限,以供許多用戶端使用。由於分散式記憶體回收所需的網路流量非常少,所以這種方法可有效地使用使用期。但是,使用稀少資源的遠端物件可擁有短存留期的使用期,而用戶端可經常以短時間範圍來加以更新。當所有的用戶端都用畢遠端物件時,.NET 遠端處理系統會快速刪除物件。這個原則可取代增加網路流量,以便更有效地使用伺服器資源。
使用使用期管理遠端物件的存留期是參考計數 (Reference Counting) 的另一種方式,這種方式在不可靠的網路連接上可能會相當地複雜且無效率。雖然存留期可設定來延長遠端物件的存留期超過明確所需,但用於參考計數和抓取用戶端所減少的網路流量,使得使用期的使用在適當地設定特定案例時,成為深具吸引力的方案。
下表描述使用期所具有的五種主要屬性。
| 屬性 | 說明 |
|---|---|
| InitialLeaseTime | 指定在使用期管理員開始刪除物件的程序之前、物件會保留在記憶體中的初始時間範圍。在組態檔中,這是 <lifetime> 組態項目的 leaseTime 屬性 (Attribute)。預設為 5 分鐘。使用期時間為零,會將使用期設定為無窮大的存留期。 |
| CurrentLeaseTime | 指定使用期到期前所剩餘的時間範圍。在更新使用期時,其 CurrentLeaseTime 設定為 CurrentLeaseTime 或 RenewOnCallTime 的最大值。 |
| RenewOnCallTime | 指定每次對物件進行遠端呼叫之後、CurrentLeaseTime 設定成的最大時間範圍。預設為 2 分鐘。 |
| SponsorshipTimeout | 指定當使用期已經到期時,使用期管理員等待贊助者回應的時間。如果支援者在指定時間內沒有回應,會移除這個支援者並呼叫另一個支援者。如果沒有任何支援者,使用期到期後,記憶體回收行程會處置 (Dispose) 遠端物件。如果值是「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 遠端處理系統這個型別的執行個體試圖擁有無限存留期。
- 您或是系統管理員也可以在應用程式或電腦組態檔中,在 <lifetime> 項目內指定特定應用程式中所有物件的存留期屬性。如需詳細資訊,請參閱初始化使用期。
使用期建立好後,可以下列三種方式更新:
- 用戶端直接呼叫 ILease.Renew 方法。
- 如果設定好 ILease.RenewOnCallTime 屬性,每一個對遠端物件的呼叫都會更新特定時間的使用期。
- 使用期呼叫 ISponsor.Renewal 方法,要求使用期更新且支援者以 TimeSpan 回應。
如需詳細資訊,請參閱更新使用期。
使用期管理員
使用期管理員必須定期檢查時間到期的使用期。當使用期的時間到期時,會通知使用期,它會藉由叫用支援者來試圖更新其本身。
使用期管理員也會維護使用期等待回覆的支援者清單。如果支援者在 SponsorshipTimeOut 時間範圍指定的期間內沒有回應,它會從支援者清單中移除。
當允許使用期到期時,就不再接受使用期訊息或支援者的傳回。使用期的參考會從使用期清單中移除,而且 .NET 遠端處理系統會移除它內部資料表中的物件參考。接著記憶體回收系統會移除使用期和物件。
請參閱
物件啟動過程和存留期 | 遠端處理範例:存留期 | 遠端設定結構描述 | ILease | RemotingServices.GetLifetimeService | MarshalByRefObject.InitializeLifetimeService | 初始化使用期 | 更新使用期