作者tofuflower (無)
看板java
標題Re: [問題]new新物件的問題
時間Fri Apr 8 00:19:57 2011
※ 引述《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