[問題] 記憶體回收,物件用完了最好釋放其參考?

看板java作者 (路人)時間12年前 (2011/08/22 09:24), 編輯推噓7(7020)
留言27則, 7人參與, 最新討論串1/1
JAVA不像C,不必擔心記憶體回收,但我反而更亂了,因為聽說... 為了讓記憶體更容易被回收,物件用完了最好釋放其參考。 以前又好像在網路上看過有人寫: LinkedList用完最好要clear(); StringBuilder用完最好setLength(0); 那普通的小物件呢? 是不是最好每個物件都弄個clearReference()清除參考的方法,物件不用時呼叫它? 還是不用那麼麻煩,要超過多大的物件才要釋放其參考呢? - - - 因為我想說先把物件釋放參考,垃圾回收器就不會浪費更多力氣, 去額外進階計算這個物件是否要被回收,也許這樣程式會更有效率? 還是我杞人憂天了? - - - 假設有兩個簡單的物件: public class A{ String s1; String s2; } public class B{ JComponent c1; JComponent c2; JComponent c3; } 每次某個物件A不用之後,就讓它 s1=null; s2=null; 每次某個物件B不用之後,就讓它 c1=null; c2=null; c3=null; 這樣對嗎?還是多此一舉? - - - 請問大家寫程式都會釋放其參考嗎?在什麼時候? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.129.37.199

08/22 09:28, , 1F
沒有被參考到的物件才有機會被 GC,我想他指的應該是這個
08/22 09:28, 1F

08/22 09:46, , 2F
垃圾回收器是個thread 不管你有無麻煩它 它還都不是傻
08/22 09:46, 2F

08/22 09:55, , 3F
呼呼的在run 有點自動控制的優勢 善用之 Java C++之不
08/22 09:55, 3F

08/22 10:04, , 4F
同是也 Java 大聲地向C++說 我有內建的thread你呢老
08/22 10:04, 4F

08/22 10:05, , 5F
08/22 10:05, 5F

08/22 11:41, , 6F
所以想請問,是否應該讓物件參考都變null,讓物件更容易被GC
08/22 11:41, 6F

08/22 11:44, , 7F
這樣會比較有效率嗎?還是這樣是多餘的,反而會讓程式碼更雜
08/22 11:44, 7F

08/22 11:50, , 8F
我是覺得不需要啦= =a
08/22 11:50, 8F

08/22 12:00, , 9F
恩XD 因為我每次按Ctrl+Alt+Del來看,記憶體好像都釋放很慢
08/22 12:00, 9F

08/22 12:03, , 10F
可能是我擔心太多吧=.=a
08/22 12:03, 10F

08/22 13:12, , 11F
java故意設計成這樣的,就是不要你插手記憶體怎麼管
08/22 13:12, 11F

08/22 13:14, , 12F
二樓,C++11 已經有 std::thread 了。
08/22 13:14, 12F

08/22 13:16, , 13F
六樓,個人建議先從降低各元件相依性的複雜性著手,
08/22 13:16, 13F

08/22 13:18, , 14F
然後在指向大型物件的地方開始考慮使用 WeekRef
08/22 13:18, 14F

08/22 13:21, , 15F
a
08/22 13:21, 15F

08/22 15:16, , 16F
自VC++ 6之後 我就投靠Java去了 請問COL~大std::thread
08/22 15:16, 16F

08/22 15:20, , 17F
是語言內建的嗎 應是lib吧^~^ 設定null是好習慣
08/22 15:20, 17F

08/22 16:55, , 18F
08/22 16:55, 18F

08/22 16:56, , 19F
為了 thread 跑去用 C++11? 有 apr util 可以用
08/22 16:56, 19F

08/23 14:58, , 20F
有同樣問題+1,為何不設為null卻要使用Ref classes..?
08/23 14:58, 20F

08/23 15:50, , 21F
設 null 不代表一定會被gc,就算call System.gc() 也一樣
08/23 15:50, 21F

08/23 19:57, , 22F
所以大家覺得上面例子,A和B兩個小物件用完要設回null嗎0.0?
08/23 19:57, 22F

08/23 20:01, , 23F
想請問到底 有設回null和沒設定,哪種比較好?還是有分情況?
08/23 20:01, 23F

08/23 20:17, , 24F
如果是局部變量 離開作用域 就自然消失 不必設null
08/23 20:17, 24F

08/23 20:22, , 25F
成員變量 作用域為整個類體內 設null為上策
08/23 20:22, 25F

08/23 20:31, , 26F
public class A{ // A是類名 不叫物件
08/23 20:31, 26F

08/24 08:57, , 27F
恩恩,謝謝^ ^ ps.稱物件是想說有new出來XD
08/24 08:57, 27F
文章代碼(AID): #1EKQ_JbU (java)