推 tofuflower:我知道GC,只是不知道系統call GC的時機為何? 04/08 00:12
※ 引述《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