Re: [問題] 在物件被註銷時自動執行某些事
先道歉,因為上次的範例有錯
Conn conn= new Conn();
conn.select();
//conn.close();
conn=null;
Thread.sleep(600000L);
那個Conn是我抓現成的範例來改的
我後來才注意到那個範例會用static的欄位去存Connection
所以連線不會被釋放.....
後來把那個Conn改成動態欄位,並呼叫System.gc()之後
連線就會被釋放了,這時候finalize也會被呼叫
從mysql的SHOW PROCESSLISE去看,也看的到連線被關閉
所以,理論上來說,開了連線之後丟著不理他
等Connection進入GC之後,連線就會被關閉了
基本上是不用擔心連線被卡住的問題
只是系統的GC時間點.....
我只知道jvm有條執行緒專門在處理GC,至於執行的時間、條件就不清楚了
另外,之前我在寫android時有用過stocket
那時stocket沒呼叫close,就真的不會切斷連線,即使activity被關閉了也一樣
印象中只有在手機關機時,server端才會顯示client斷線
我不清楚android在底層是怎麼處理的
也看過activity關閉重新打開之後,上次設定的static欄位的值還在之類的狀況
我猜這跟平台的運作有關係
所以我不確定依靠GC去關Connection,會不會遇到什麼問題
還有,看到推文有提到PhantomReference之類的東西
看起來挺有趣的.....
java.lang.ref
PhantomReference
Reference
ReferenceQueue
SoftReference
WeakReference
目前我試過的只有裡面的get()那個方法
被WeakReference SoftReference參考的物件,在符合GC條件時一樣會被回收掉
很適合用來偵測物件是否存活、資源管理之類的用途......
好像也可以在物件符合GC條件時,把物件拿回來的樣子
這部分的功能我只看過javadoc,還沒實際試過
如果可以運作的話
就可以做出自動回收Connection、PreparedStatement之類的功能了
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.16.65
推
06/13 14:41, , 1F
06/13 14:41, 1F
→
06/13 16:05, , 2F
06/13 16:05, 2F
→
06/13 17:37, , 3F
06/13 17:37, 3F
PhantomReference
SoftReference
WeakReference
之後試出來的結果,上面這幾個都沒辦法這樣用
這幾個在綁定的物件的finalize被呼叫過後
才會被放到ReferenceQueue中
等於是說..... 這只用在物件被註銷後,打算來做些什麼事才會用到
我能想到的用途也只有.....
記憶體快取之類的功能而已
另外,試著讓程式不呼叫System.gc(); 讓他跑
結果程式跟mysql的連線就掛在那邊,一個多小時都沒斷掉 (都沒進行過gc)
相對應的Reference物件當然也沒進到ReferenceQueue中
如果設定個迴圈讓系統去gc
大概第一、二次呼叫gc的時候就會自己把連線切斷了
另外SoftReference、WeakReference、PhantomReference在遇到GC時的差異是
WeakReference跟PhantomReference第一次GC時就會被清除
SoftReference第二次才會被清除
※ 編輯: LaPass 來自: 125.233.152.211 (06/14 08:14)
→
06/14 08:30, , 4F
06/14 08:30, 4F
→
06/14 08:58, , 5F
06/14 08:58, 5F
→
06/14 09:15, , 6F
06/14 09:15, 6F
→
06/14 10:30, , 7F
06/14 10:30, 7F
→
06/14 10:36, , 8F
06/14 10:36, 8F
→
06/14 10:43, , 9F
06/14 10:43, 9F
→
06/14 10:44, , 10F
06/14 10:44, 10F
→
06/14 10:45, , 11F
06/14 10:45, 11F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 3 之 7 篇):