看板 java 關於我們 聯絡資訊
※ 引述《tkcn (小安)》之銘言: : ※ 引述《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 的文章來看吧,光看我說的實在是不夠。 感謝您的回覆~ 推文麻煩 還是回文好了 我知道java 有GC 但是不確定系統會自己做GC的時間為何 (要評估自己使用GC還是給系統自動使用GC) 以及GC回收的記憶體是那些? 例如 MyObject obj=new MyObject(); //第一次分配記憶體給obj obj=new MyObject(); //分配新的記憶體給obj 那GC以後是第一次分配的記憶體會被回收嗎? init內部已經沒可以優化的空間了...orz 不然我也不會那麼苦惱qq btw 有辦法偵測目前jvm使用記憶體的情況然後決定是否要使用GC嗎... 例如 if(記憶體快用完了) { 使用GC } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.164.159.249 ※ 編輯: tofuflower 來自: 218.164.159.249 (04/08 00:20)
james732:你可以查查看上篇文章「System.gc();」這東東的意義 04/08 00:29
james732:Java的GC不是三言兩語可以說盡,建議google看相關資料 04/08 00:30
james732:千萬不要沒查過System.gc();就隨便用,上次這麼做的人... 04/08 00:34
legnaleurc:草已經長這麼高了 04/08 03:01
sk8er411:= =樓上的有沒有這麼幽默! 04/22 23:12