第 9 章
本章中的接口和類用于 RMI 的分布式垃圾收集器 (DGC)。
主題:
接口 DGC
Lease 類
ObjID 類
UID 類
VMID 類
9.1 接口 DGC
DGC 抽象用于分布式垃圾收集算法的服務(wù)器端。此接口包含兩種方法:dirty 和
clean。當(dāng)遠(yuǎn)程引用在客戶機(jī)(客戶機(jī)由 VMID 表示)端解編時(shí),將調(diào)用 dirty
。當(dāng)客戶機(jī)中不再存在對(duì)遠(yuǎn)程引用的引用時(shí),將進(jìn)行相應(yīng)的清理調(diào)用。失敗的 d
irty 調(diào)用必須預(yù)定一次 strong(強(qiáng))clean 調(diào)用,以便保留調(diào)用順序號(hào)碼,從
而檢測以后由分布式垃圾收集器接收的無序調(diào)用。
對(duì)遠(yuǎn)程對(duì)象的引用將被擁有該引用的客戶機(jī)租用 (leased) 一段時(shí)間。租用期從
接收到 dirty 調(diào)用時(shí)開始??蛻魴C(jī)必須在租用到期前在其所保存的遠(yuǎn)程引用上再
次調(diào)用 dirty,以便進(jìn)行續(xù)租。如果在到期之前不續(xù)租,則分布式垃圾收集器就
認(rèn)為該客戶機(jī)不再引用遠(yuǎn)程對(duì)象。
package java.rmi.dgc;
import java.rmi.server.ObjID;
public interface DGC extends java.rmi.Remote
{
Lease dirty(ObjID[] ids, long sequenceNum, Lease lease)
throws java.rmi.RemoteException;
void clean(ObjID[] ids, long seqNum, VMID vmid, boolean strong)
throws java.rmi.RemoteException;
}
方法 dirty 請(qǐng)求租用與數(shù)組參數(shù) ids 中所含對(duì)象標(biāo)識(shí)符相關(guān)聯(lián)的遠(yuǎn)程對(duì)象引用
。lease 包含客戶機(jī)唯一虛擬機(jī)標(biāo)識(shí)符 (VMID) 和請(qǐng)求的租用期。垃圾收集器將
為每個(gè)本地虛擬機(jī)中導(dǎo)出的遠(yuǎn)程對(duì)象保留一個(gè) reference list(引用列表)--
保存引用的客戶機(jī)列表。如果準(zhǔn)予租用,垃圾收集器將把客戶機(jī) VMID 添加到 i
ds 中指示的每個(gè)遠(yuǎn)程對(duì)象的引用列表中。sequenceNum 用來檢測和丟棄后期垃圾
收集器調(diào)用的順序號(hào)。每次調(diào)用垃圾收集器,順序號(hào)都將增大。
某些客戶機(jī)不能生成唯一的 VMID。這是因?yàn)橹挥挟?dāng) VMID 包含 true(真)主機(jī)
地址時(shí),才是通用的唯一標(biāo)識(shí)符。由于安全性限制,某些客戶機(jī)將無法獲得該地
址。此種情況下,客戶機(jī)可以使用空 VMID。分布式垃圾收集器將為客戶機(jī)指派
VMID。
dirty 調(diào)用將返回 Lease 對(duì)象,其中包含遠(yuǎn)程引用所用的 VMID 和準(zhǔn)許的租用期
(服務(wù)器可以決定授予比客戶機(jī)請(qǐng)求短的租用期)??蛻魴C(jī)必須使用垃圾收集器
所用的 VMID,以便在客戶機(jī)釋放遠(yuǎn)程對(duì)象引用時(shí)進(jìn)行相應(yīng)的 clean 調(diào)用。
客戶虛擬機(jī)僅需對(duì)每個(gè)虛擬機(jī)中引用的遠(yuǎn)程引用進(jìn)行一次初始 dirty 調(diào)用(即使
它對(duì)同一遠(yuǎn)程對(duì)象進(jìn)行多次引用)。此外,客戶機(jī)還必須在租用到期前調(diào)用 dir
ty 對(duì)遠(yuǎn)程引用的租用進(jìn)行續(xù)租。當(dāng)客戶機(jī)對(duì)特定的遠(yuǎn)程對(duì)象再無任何引用時(shí),必
須為與該引用關(guān)聯(lián)的對(duì)象 ID 預(yù)定一次 clean 調(diào)用。
clean 調(diào)用將從 ids 指定的遠(yuǎn)程對(duì)象的引用列表中刪除 vmid。順序號(hào)用來檢測
以后的清理操作。如果參數(shù) strong 為真,則代表 clean 調(diào)用是一次失敗的 di
rty 調(diào)用的結(jié)果。此時(shí)應(yīng)記住客戶機(jī) vmid 的順序號(hào)。
9.2 Lease 類
租用包含一個(gè)唯一的虛擬機(jī)標(biāo)識(shí)符和一個(gè)租用期。Lease 對(duì)象用來請(qǐng)求及準(zhǔn)予對(duì)
遠(yuǎn)程對(duì)象引用的租用。
package java.rmi.dgc;
public final class Lease implements java.io.Serializable
{
public Lease(VMID id, long duration);
public VMID getVMID();
public long getValue();
}
Lease 構(gòu)造函數(shù)創(chuàng)建帶有特定 VMID 和租用期的租用。VMID 可以為 null。
getVMID 方法返回與租用相關(guān)聯(lián)的客戶機(jī) VMID。
getValue 方法返回租用期。
9.3 ObjID 類
類 ObjID 用來作為虛擬機(jī)中對(duì)遠(yuǎn)程對(duì)象的唯一標(biāo)識(shí)。每個(gè)標(biāo)識(shí)符均包含一個(gè)對(duì)象
號(hào)和一個(gè)特定主機(jī)上的唯一地址空間標(biāo)識(shí)符。對(duì)象標(biāo)識(shí)符將在導(dǎo)出遠(yuǎn)程對(duì)象時(shí)指
派給該對(duì)象。
ObjID 由對(duì)象號(hào) (long) 和地址空間的唯一標(biāo)識(shí)符 (UID) 組成。
package java.rmi.server;
public final class ObjID implements java.io.Serializable
{
public ObjID ();
public ObjID (int num);
public void write(ObjectOutput out) throws java.io.IOException;
public static ObjID read(ObjectInput in)
throws java.io.IOException;
public int hashCode()
public boolean equals(Object obj)
public String toString()
}
ObjID 構(gòu)造函數(shù)的第一種形式將生成唯一的對(duì)象標(biāo)識(shí)符。第二個(gè)構(gòu)造函數(shù)生成已
知的對(duì)象標(biāo)識(shí)符(例如注冊(cè)服務(wù)程序和分布式垃圾收集器所用的標(biāo)識(shí)符),并將
已知的對(duì)象號(hào)用作參數(shù)。第二個(gè)構(gòu)造函數(shù)所生成的已知對(duì)象 ID 與缺省構(gòu)造函數(shù)
所生成的對(duì)象 ID 不沖突;為強(qiáng)制實(shí)現(xiàn)這一點(diǎn),ObjID 的對(duì)象號(hào)將被設(shè)置為構(gòu)造
函數(shù)中提供的“已知”號(hào),同時(shí)所有 UID 域均將設(shè)置為零。
方法 write 將對(duì)象 ID 的表示法編組到輸出流中。
方法 read 構(gòu)造一個(gè)對(duì)象 ID,其內(nèi)容將從指定的輸入流中讀取。
方法 hashCode 將對(duì)象號(hào)作為 hashcode 返回。
如果 obj 與 ObjID 內(nèi)容相同,則 equals 方法返回 true。
toString 方法返回一個(gè)包含對(duì)象 ID 表示法的字符串。僅當(dāng)對(duì)象 ID 來自非本地
地址空間時(shí),地址空間標(biāo)識(shí)符才將含在字符串表示法中。
.4 UID 類
UID 是一種抽象類,用來創(chuàng)建生成它的主機(jī)的唯一標(biāo)識(shí)符。它將以地址空間標(biāo)識(shí)
符的形式含在 ObjID 中。UID 由一個(gè)在主機(jī)上唯一的號(hào)碼 (int)、時(shí)間 (long)
和計(jì)數(shù)組成 (short)。
package java.rmi.server;
public final class UID implements java.io.Serializable
{
public UID();
public UID(short num);
public int hashCode();
public boolean equals(Object obj);
public String toString();
public void write(DataOutput out) throws java.io.IOException;
public static UID read(DataInput in) throws java.io.IOException;
}
構(gòu)造函數(shù)的第一種形式將創(chuàng)建生成它的主機(jī)的唯一純標(biāo)識(shí)符。此 UID 在以下條件
下具有唯一性:a) 計(jì)算機(jī)需要一秒以上的時(shí)間進(jìn)行重新啟動(dòng),b) 計(jì)算機(jī)的時(shí)鐘
將永不向前調(diào)整。為了構(gòu)造全局唯一的 UID,只需將 UID 與 InetAddress 分別
配對(duì)。
構(gòu)造函數(shù)的第二種形式將創(chuàng)建一種已知的 UID。已知 ID 有 216 -1 種可能。這
種構(gòu)造函數(shù)所生成的 ID 不會(huì)與缺省 UID 構(gòu)造函數(shù)所生成的 ID 沖突。缺省構(gòu)造
函數(shù)生成主機(jī)上真正唯一的標(biāo)識(shí)符。
方法 hashCode、equals 和 toString 是為 UID 所定義的。如果兩個(gè) UID 的內(nèi)
容相同,則視為二者等價(jià)。
方法 write 將把 UID 寫入輸出流中。
方法 read 構(gòu)造一個(gè) UID,其內(nèi)容將從指定輸入流中讀取。