看板 java 關於我們 聯絡資訊
※ 引述《tofuflower (無)》之銘言: : 請問下列三種寫法 : 1. : MyObject obj; : for(int i=0;i<10000000;i++) : { : obj=new MyObject(); : do something...... : } : 2. : for(int i=0;i<10000000;i++) : { : MyObject obj=new MyObject(); : do something...... : } : 3. : MyObject obj=new MyObject(); : for(int i=0;i<10000000;i++) : { : obj.init(); : do something...... : } : 其中3是我現在的寫法,但是obj.init()會花太多時間 : (比new一個新的MyObject還花時間) 聽起來只是設計不當。 : 所以想請問1和2這兩種寫法那種比較好? 就效率來說,1 跟 2 完全感受不到差別。 撇開效率不談, 如果 obj 在回圈之外完全用不到, 我會認為宣告在迴圈之內是較好的, 差別在迴圈外是否多一個沒有用的變數, 可能會造成誤用或閱讀上的困擾。 : 2我的議題是這樣每次都宣告一個新的obj,那上一個obj memory會回收嗎? : 如果會是甚麼時候回收? : ps.一開始用過2的寫法,但曾經出現過java heap size的問題... : 感覺就是一直宣告MyObject obj=new MyObject()把記憶體塞爆? 你似乎不知道有 Garbage Collection(GC) 這東西。 簡單的說,GC 會幫你做回收的動作, 只要你把指向物件的 refrence 都都拿掉, 待 GC 運作後,物件就會被回收。 你並不知道他什麼時候去做,也不能指定他立刻去做, 但大部分的情況下,我認為 GC 都運作的很不錯。 在你的例子當中, 大概是因為物件產生的速度高於回收的速度, 所以最後當然會爆掉。 如果你的需求真的必須如此, 也許可以在迴圈裡頭放個 System.gc() "建議" GC 去做事。 : 1我的議題是雖然只宣告一次obj : 但之後也是每次都分給他一個新的memory空間...? : 和2的寫法比好像一樣? : 總之我不太了解java在甚麼時候會回收不用的記憶體? : 而怎樣的情況下該變數的記憶體會被認定為不在使用可以回收的? 你無法控制物件何時會被回收, 但只有當物件被有被 refrence 時,該物件才有可能被回收。 : 煩請有經驗的版友指教 : 或者有人有推薦的書即可以介紹一下的 : 感謝 orz... 找些說明 GC 的文章來看吧,光看我說的實在是不夠。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.78.231
tofuflower:我知道GC,只是不知道系統call GC的時機為何? 04/08 00:12