Re: [問題] 在物件被註銷時自動執行某些事

看板java作者 (LaPass)時間13年前 (2012/06/13 13:54), 編輯推噓1(1010)
留言11則, 6人參與, 最新討論串3/7 (看更多)
先道歉,因為上次的範例有錯 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
Effective Java says: nerver rely on finalizer.
06/13 14:41, 1F

06/13 16:05, , 2F
那可以依賴Reference嗎? XD
06/13 16:05, 2F

06/13 17:37, , 3F
與其相信GC/finalizer/Reference, 不如直接 call close
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
System.gc 不保證一定會執行,所以量大你依賴它 = 找死
06/14 08:30, 4F

06/14 08:58, , 5F
再講一次,不應在finalize才釋放自OS/其它AP取得應還的資源
06/14 08:58, 5F

06/14 09:15, , 6F
樓上 & 樓樓上 +1
06/14 09:15, 6F

06/14 10:30, , 7F
現有的Connection pool都是設定時間,超時就拿回去,這可能
06/14 10:30, 7F

06/14 10:36, , 8F
是目前最好的解決法了。
06/14 10:36, 8F

06/14 10:43, , 9F
並沒有超時就會拿回去,要視你的 configuration 而定。
06/14 10:43, 9F

06/14 10:44, , 10F
並且 connection pool 大多再包一層 proxy,會偵測發出去的
06/14 10:44, 10F

06/14 10:45, , 11F
connection 有沒有動作,要 idle 到那個時間有困難。。
06/14 10:45, 11F
文章代碼(AID): #1Fs2hwV8 (java)
討論串 (同標題文章)
文章代碼(AID): #1Fs2hwV8 (java)