-
1 # 駭客之家
-
2 # 無為先生
我覺得這個問題需要分情況:
1、如果每次需要的物件是單一不變的,應該考慮使用單例;
2、如果每次要求物件是新的,考慮引入物件池,採用預分配的機制。
如果一味的new物件,而不去銷燬物件,最終會導致記憶體溢位
-
3 # 小衚衕學SH
1.在迴圈體外,始終都是這一個物件,迴圈放入的都是最新的值。
2.在迴圈體內,建立的是不同的物件,每次放入的對應這不同值的物件。
事實上在Java的GC回收機制中如果一個物件有著具體的引用,那麼是不會被GC自動回收的。
也就是說:
Card mCard = new Card();//寫在N個迴圈內等於你有N個引用對應了N個物件
所以N個物件在一段時間內都是會佔用記憶體,直到記憶體不足GC主動回收
mCard = new Card();//寫在N個迴圈內等於你使用1個引用分別N次呼叫了N個物件
所以當後一個物件init後,前一個物件已經是“無引用狀態”,會很快的被GC自動回收,有可能在你的迴圈還未結束時,就已經進行了多次GC回收,這點很重要。
也就是說我個人比較偏向用第二種方法,這個應該能更好的管理記憶體。
-
4 # 農非農
針對這個問題首先需要分析,程式碼邏輯上是否一定要在迴圈中建立物件。
1、如果不是必須的就需要最佳化程式碼邏輯。因為java中每次new建立一個物件就需要分配記憶體,對於Java物件來講,如果說這個物件一直被其他物件所引用,則該物件不會被垃圾回收器回收。而迴圈中不斷建立物件,導致程式佔用記憶體越來越多,最後可能導致頻繁Minor GC或者Full GC,甚至記憶體溢位,這是應該儘量避免的。
2、如果迴圈中建立物件無法避免,則需要分析每次需要的物件型別。
(1)、如果每次需要的物件可以是不變的,則可以使用單例,這樣就只需要建立一次,多次呼叫即可。
(2)、如果每次需要的物件要不一樣的,則需要分析每次建立的物件是隻需要在迴圈裡面使用,還是把物件放入集合中在迴圈體外面使用。
a、如果每次建立的物件只在迴圈裡面使用,則可以把引用的宣告放在迴圈外面,迴圈裡面每次建立不同的物件。這樣就是分別把多個物件地址賦值給同一個引用,當把一個新物件地址賦值給引用時,前一個物件已經是無引用狀態,可以更快的被垃圾回收器回收,有可能迴圈還未結束,前面建立的物件已經被回收了,這樣可以更快的釋放記憶體。
b、如果每次建立的物件有在迴圈外面使用,則引用的宣告和物件的建立都需要放在迴圈裡面。這種情況是最不理想的,因為建立的物件太多,且都有引用指向物件,這樣垃圾回收器就不能回收物件,佔用記憶體較多。
回覆列表
首先應該看一下程式碼邏輯是否可以最佳化,頻繁new物件就是不斷的在分配記憶體,之後垃圾回收器會不斷地回收不在使用的記憶體,這會發生記憶體抖動,導致效能非常差。應該儘量避免。
如果避免不了new物件,可以採用物件池,先分配一塊記憶體,之後使用時從物件池中取,而不是頻繁new物件。