回覆列表
  • 1 # 駭客之家

    首先應該看一下程式碼邏輯是否可以最佳化,頻繁new物件就是不斷的在分配記憶體,之後垃圾回收器會不斷地回收不在使用的記憶體,這會發生記憶體抖動,導致效能非常差。應該儘量避免。

    如果避免不了new物件,可以採用物件池,先分配一塊記憶體,之後使用時從物件池中取,而不是頻繁new物件。

  • 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、如果每次建立的物件有在迴圈外面使用,則引用的宣告和物件的建立都需要放在迴圈裡面。這種情況是最不理想的,因為建立的物件太多,且都有引用指向物件,這樣垃圾回收器就不能回收物件,佔用記憶體較多。

  • 中秋節和大豐收的關聯?
  • 學習java可以做遊戲嗎?