java中會存在記憶體流失嗎,請簡單描述。

來源:互聯網
上載者:User

 

會。java導致記憶體泄露的原因很明確:長生命週期的對象持有短生命週期對象的引用就很可能發生記憶體泄露,儘管短生命週期對象已經不再需要,但是因為長生命週期對象持有它的引用而導致不能被回收,這就是java中記憶體泄露的發生情境。

    1.集合類,集合類僅僅有添加元素的方法,而沒有相應的刪除機制,導致記憶體被佔用。這一點其實也不明確,這個集合類如果僅僅是局部變數,根本不會造成記憶體泄露,在方法棧退出後就沒有引用了會被jvm正常回收。而如果這個集合類是全域性的變數(比如類中的靜態屬性,全域性的map等即有靜態引用或final一直指向它),那麼沒有相應的刪除機制,很可能導致集合所佔用的記憶體只增不減,因此提供這樣的刪除機制或者定期清除策略非常必要。

   2.單例模式。不正確使用單例模式是引起記憶體泄露的一個常見問題,單例對象在被初始化後將在JVM的整個生命週期中存在(以靜態變數的方式),如果單例對象持有外部對象的引用,那麼這個外部對象將不能被jvm正常回收,導致記憶體泄露,考慮下面的例子:

  class A{

  public A(){

    B.getInstance().setA(this);

  }

  ....

  }

  //B類採用單例模式

  class B{

  private A a;

  private static B instance=new B();

  public B(){}

  public static B getInstance(){

  return instance;

  }

  public void setA(A a){

  this.a=a;

  }

  //getter...

  }

  顯然B採用singleton模式,他持有一個A對象的引用,而這個A類的對象將不能被回收。想象下如果A是個比較大的對象或者集合類型會發生什麼情況。

   上面所講的這些也啟發我們如何去尋找記憶體泄露問題,在代碼複審的時候關注長生命週期對象:全域性的集合、單例模式的使用、類的static變數等等。在Java的實現過程中,也要考慮其對象釋放,最好的方法是在不使用某對象時,顯式地將此對象賦空。最好遵循誰建立誰釋放的原則。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.