Java記憶體泄露的一個小例子__Java

來源:互聯網
上載者:User
Java記憶體泄露

    一般來說記憶體流失有兩種情況。一種情況如在C/C++語言中的,在堆中的分配的記憶體,在沒有將其釋放掉的時候,就將所有能訪問這塊記憶體的方式都刪掉(如指標重新賦值);另一種情況則是在記憶體對象明明已經不需要的時候,還仍然保留著這塊記憶體和它的訪問方式(引用)。第一種情況,在Java中已經由於記憶體回收機制的引入,得到了很好的解決。所以,Java中的記憶體流失,主要指的是第二種情況。

    可能光說概念太抽象了,大家可以看一下這樣的例子:

1 Vector v= new Vector(10);
2  for ( int i=1;i<100; i++){
3 Object o= new Object();
4 v.add(o);
5 o= null;
6 }

   
    在這個例子中,代碼棧中存在Vector對象的引用v和Object對象的引用o。在For迴圈中,我們不斷的產生新的對象,然後將其添加到Vector對象中,之後將o引用置空。問題是當o引用被置空後,如果發生GC,我們建立的Object對象是否能夠被GC回收呢。答案是否定的。因為,GC在跟蹤代碼棧中的引用時,會發現v引用,而繼續往下跟蹤,就會發現v引用指向的記憶體空間中又存在指向Object對象的引用。也就是說儘管o引用已經被置空,但是Object對象仍然存在其他的引用,是可以被訪問到的,所以GC無法將其釋放掉。如果在此迴圈之後,Object對象對程式已經沒有任何作用,那麼我們就認為此Java程式發生了記憶體流失。

    儘管對於C/C++中的記憶體泄露情況來說,Java記憶體泄露導致的破壞性小,除了少數情況會出現程式崩潰的情況外,大多數情況下程式仍然能正常運行。但是,在行動裝置對於記憶體和CPU都有較嚴格的限制的情況下,Java的記憶體溢出會導致程式效率低下、佔用大量不需要的記憶體等問題。這將導致整個機器效能變差,嚴重的也會引起拋出OutOfMemoryError,導致程式崩潰

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.