JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:關於gc的問題?!請指教!thanks~ [Re:cflute]
worookie

Small Ship

版主

發文: 2092
積分: 21
於 2003-07-31 11:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
底下是家芸妹妹在兩個月前發表的有關 weak ref 的文章, 給大家參考看看

※ 引述《Haruka.bbs@bbs.cis.nctu.edu.tw (小魚)》之銘言:
> 下面是一段有關weakReference的程式碼
> import java.lang.ref.*;
> class MyObject
> {
> protected void finalize() throws Throwable
> {
> System.out.println("In finalize method for this object: " +
> this);
> }
> }
> class ReferenceUsage
> {
> public static void main(String args[])
> {
> hold();
> release();
> }
> public static void hold()
> {
> System.out.println("Example of incorrectly holding a strong " +
> "reference");
> MyObject obj = new MyObject();
> System.out.println("object is " + obj);
> ReferenceQueue rq = new ReferenceQueue();
> WeakReference wr = new WeakReference(obj, rq);
> System.out.println("The weak reference is " + wr);
> System.out.println("Polling the reference queue returns " +
> rq.poll());
> System.out.println("Getting the referent from the " +
> "weak reference returns " + wr.get());
> System.out.println("Calling GC");
> System.gc();
> System.out.println("Polling the reference queue returns " +
> rq.poll());
> System.out.println("Getting the referent from the " +
> "weak reference returns " + wr.get());
> }
> public static void release()
> {
> System.out.println("");
> System.out.println("Example of correctly releasing a strong " +
> "reference");
> MyObject obj = new MyObject();
> System.out.println("object is " + obj);
> ReferenceQueue rq = new ReferenceQueue();
> WeakReference wr = new WeakReference(obj, rq);
> System.out.println("The weak reference is " + wr);
> System.out.println("Polling the reference queue returns " +
> rq.poll());
> System.out.println("Getting the referent from the " +
> "weak reference returns " + wr.get());
> System.out.println("Set the obj reference to null and call GC");
> obj = null;
> System.gc();
> System.out.println("Polling the reference queue returns " +
> rq.poll());
> System.out.println("Getting the referent from the " +
> "weak reference returns " + wr.get());
> obj = wr.get();
> }
> }
> 文件上面是說
> The idea behind these classes is to avoid pinning an object in memory
> for the duration of the application.Instead, you softly, weakly, or
> phantomly refer to an object, allowing the garbage collector to optionally
> free it. This usage can be beneficial when you want to minimize the
> amount of heap memory an application uses over its lifetime.
> 我的問題在於,既然都把obj設為null了,那weakReference和strongReference
> 有什麼差別,難道在需要使用obj的時候,weakReference還可以再拿回來使用 ?
> 感謝回答Smile

你可能已被 reference 和 referent 的意思搞混了.
obj 是個 (strong) reference,
reference 有多少個, 是不是 null, 我們大可不必在乎.
我們所在乎的是 referent, 也就是之前的 "new MyObject()".
如果你要再使用 MyObject 的實體的話,
把你的程式的最後一行 "obj = wr.get();" 修正成底下這樣:
obj = (MyObject) wr.get();
if (obj == null) {
obj = new MyObject();
wr = new WeakReference(obj, rq);
}
// 作你想對 obj 所作的事

[家芸妹妹的總結]
> 這樣作好像是省記憶體省到摳的作法 Tongue
> obj 用完把它 = null
> garbage collector 就可以對它的實體(MyObject)作處理
> 但不一定在什麼時候把記憶體清出來
> 要再用到 MyObject 時
> obj = (MyObject) wr.get();
> 如果剛才的那個還在記憶體裡, obj 就又指到同樣的實體
> 也可能已經清掉, 所以要作判斷, 已經清掉得重建
> 我不清楚用 System.gc(); 是不是會把能清的都清掉
> run 好幾次
> 最底下的那個程式, 都是有清掉
> 把 System.gc(); comment 掉就可以看到沒清的結果
> 但程式裡不寫 gc(), virtual machine 還是會自動在該做的時候做
> 所以這就是 reference classes 的奧妙??
> 我一開始還想不透既然都是被清掉, 然後再 new 一次
> 多那個 WeakReferenc 是要做什麼, 有跟沒有一樣
> 後來才想到 gc() 大概是示範才加的
> 實際程式裡大多讓 virtual machine 自己作
> WeakReferenc 就有機會發揮功用


JiaYun edited on 2003-07-31 11:18
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
15146 [精華] 關於gc的問題?!請指教!thanks~ cflute 749 2003-07-26 17:27
13803 Re:關於gc的問題?!請指教!thanks~ worookie 23 2003-07-26 17:31
13901 Re:關於gc的問題?!請指教!thanks~ marty 67 2003-07-26 18:18
16727 Re:關於gc的問題?!請指教!thanks~ worookie 3813 2003-07-31 11:15
14509 Re:關於gc的問題?!請指教!thanks~ Duncan 954 2003-07-31 13:36
13130 Re:關於gc的問題?!請指教!thanks~ Yoshi 759 2003-07-31 18:35
13407 Re:關於gc的問題?!請指教!thanks~ ymshin 144 2003-07-26 17:42
13508 Re:關於gc的問題?!請指教!thanks~ Biologic 427 2003-07-26 18:25
13216 Re:關於gc的問題?!請指教!thanks~ ymshin 325 2003-07-26 18:36
13339 Re:關於gc的問題?!請指教!thanks~ Biologic 682 2003-07-26 18:49
13438 Re:關於gc的問題?!請指教!thanks~ Biologic 863 2003-07-26 18:51
13257 Re:關於gc的問題?!請指教!thanks~ Yoshi 648 2003-07-26 18:56
13157 Re:關於gc的問題?!請指教!thanks~ cflute 365 2003-07-26 19:08
13184 Re:關於gc的問題?!請指教!thanks~ Yoshi 485 2003-07-26 19:14
13118 Re:關於gc的問題?!請指教!thanks~ ymshin 980 2003-07-26 19:57
13123 Re:關於gc的問題?!請指教!thanks~ JiaYun 390 2003-07-26 20:18
13114 Re:關於gc的問題?!請指教!thanks~ ymshin 224 2003-07-26 20:23
13060 Re:關於gc的問題?!請指教!thanks~ JiaYun 96 2003-07-26 20:29
13051 Re:關於gc的問題?!請指教!thanks~ ymshin 237 2003-07-26 20:46
13508 Re:關於gc的問題?!請指教!thanks~ marty 459 2003-07-26 20:58
13054 Re:關於gc的問題?!請指教!thanks~ Biologic 501 2003-07-26 20:53
13014 Re:關於gc的問題?!請指教!thanks~ JiaYun 113 2003-07-26 20:54
13110 Re:關於gc的問題?!請指教!thanks~ Biologic 138 2003-07-26 21:16
13049 Re:關於gc的問題?!請指教!thanks~ Forth 23 2003-07-26 21:03
13050 Re:關於gc的問題?!請指教!thanks~ Biologic 127 2003-07-26 21:08
13059 Re:關於gc的問題?!請指教!thanks~ Yoshi 591 2003-07-26 22:44
12984 Re:關於gc的問題?!請指教!thanks~ Biologic 245 2003-07-26 23:42
13265 Re:關於gc的問題?!請指教!thanks~ ymshin 3174 2003-07-27 01:41
13577 Re:關於gc的問題?!請指教!thanks~ Yoshi 2196 2003-07-27 03:15
13190 Re:關於gc的問題?!請指教!thanks~ ymshin 3361 2003-07-27 08:14
14474 Re:關於gc的問題?!請指教!thanks~ Duncan 1450 2003-07-27 14:39
12881 Re:關於gc的問題?!請指教!thanks~ ymshin 626 2003-07-27 10:48
11337 Re:關於gc的問題?!請指教!thanks~ peipei36 800 2005-09-25 00:51
13129 Re:關於gc的問題?!請指教!thanks~ cflute 162 2003-07-26 18:17
13094 Re:關於gc的問題?!請指教!thanks~ ymshin 326 2003-07-26 18:26
13111 Re:關於gc的問題?!請指教!thanks~ Yoshi 295 2003-07-26 18:32
13024 Re:關於gc的問題?!請指教!thanks~ cflute 90 2003-07-26 18:22
13702 Re:關於gc的問題?!請指教!thanks~ Yoshi 703 2003-07-26 18:30
13387 Re:關於gc的問題?!請指教!thanks~ marty 172 2003-07-26 18:27
15549 Re:關於gc的問題?!請指教!thanks~ Duncan 54 2003-07-26 22:17
12851 Re:關於gc的問題?!請指教!thanks~ ymshin 947 2003-07-27 19:07
13818 Re:關於gc的問題?!請指教!thanks~ Duncan 730 2003-07-27 19:33
12886 Re:關於gc的問題?!請指教!thanks~ ymshin 879 2003-07-27 20:01
13391 Re:關於gc的問題?!請指教!thanks~ saijone 1031 2003-07-31 10:13
13111 Re:關於gc的問題?!請指教!thanks~ popcorny 776 2003-07-31 10:29
12738 Re:關於gc的問題?!請指教!thanks~ saijone 128 2003-07-31 10:42
12833 Re:關於gc的問題?!請指教!thanks~ popcorny 259 2003-07-31 10:54
13065 Re:關於gc的問題?!請指教!thanks~ saijone 567 2003-07-31 11:12
» JWorld@TW »  Java SE 討論區

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8