測不准原理
想做一個物理實驗
看看某物質的導電情形
於是接上電壓
並串聯上一個安培計來觀察電流
但是你知道嗎? 安培計本身也帶有電阻
造成你的實驗准確度受到影響
諸如此類的問題在科學界很常見
所以有了「測不准原理」之說
不只是物理
測不准的現象在計算機上也有可能發生
比方說
你想寫一個觀察程序
觀察 CPU 在執行某程序之下的使用率
但是你的觀察程序本身也會占用一部份的 CPU 效能
造成測出來的數據不精確
再想象下面的情況
如果你想寫一個 Java 程序
觀察某對象什麼時候會被垃圾收集的執行緒清除
所以你必須要用 一個 reference 記住此對象
以便隨時觀察
但是卻因此造成此對象的 reference 數目一直無法為零
使得對象無法被清除
又是「測不准」
java
lang
ref
WeakReference
不過
現在有了 Weak Reference 之後
這就可以迎刃而解了
如果你希望能隨時取得某對象的信息
但又不想影響此 對象的垃圾收集
那麼你應該用 Weak Reference 來記住此對象
而不是用一般的 reference
請看下面的例子
WeakReference wr = new WeakReference(obj);
if (wr
get()==null) {
System
out
println(
obj 已經被清除了
);
} else {
System
out
println(
obj 尚未被清除
其信息是
+obj
toString());
}
在此例中
透過 get() 可以取得此 Reference 的所指到的對象
如果傳出值為 null 的話
代表此對象已經被清除
這類的技巧
在設計 Optimizer 或 Debugger 這類的程序時常會用到
因為這類程序需要取得某對象的信息
但是不可以 影響此對象的垃圾收集
java
lang
ref
SoftReference
Soft Reference 雖然和 Weak Reference 很類似
但是用途卻不同
SoftReference 是用來設計 object
cache 之用的
被 Soft Reference 指到的對象
即使沒有任何 Direct Reference
也不會被清除
一直要到 JVM 內存不足時且 沒有 Direct Reference 時才會清除
如此一來 SoftReference 不但可以把對象 cache 起來
也不會造成內存不足的錯誤 (OutOfMemoryError)
我覺得 Soft Reference 也適合拿來實作 pooling 的技巧
java
lang
ref
PhantomReference
Phantom Reference 主要是用來取代對象的 finalize()
程序員利用 finalize() 來進行釋放資源的同時
有可能不小心 讓此對象再度擁有 Direct Reference
但是使用 Phantom Reference 則不會有此情形發生
和 Weak Reference 以 及 SoftReference 最大的不同是
Phantom Reference 一訂要搭配著 ReferenceQueue 使用
因為 Phantom Reference 的 get() 傳 出值一定是 null(以避免此對象不小心再度擁有 Direct Reference)
通常我們會設計一個 class 繼承 PhantomReference
然 後 override 其 clear() 來定義釋放資源等收尾的動作
當然
我寧可小心一點地使用 finalize()
也不願意自找麻煩地使用 Phantom Reference
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19514.html