內存泄露和內存溢出區別

1、內存泄漏是指分配出去的內存無法回收了

2、內存溢出是指程序要求的內存,超出了系統所能分配的範圍,從而發生溢出

   爲了便於理解,我們不妨打個比方。緩衝區溢出好比是將十磅的糖放進一個只能裝五磅的容器裏。一旦該容器放滿了,餘下的部分就溢出在櫃檯和地板上,弄得一團糟。由於計算機程序的編寫者寫了一些編碼,但是這些編碼沒有對目的區域或緩衝區——五磅的容器——做適當的檢查,看它們是否夠大,能否完全裝入新的內容——十磅的糖,結果可能造成緩衝區溢出的產生。如果打算被放進新地方的數據不適合,溢得到處都是,該數據也會製造很多麻煩。但是,如果緩衝區僅僅溢出,這只是一個問題。到此時爲止,它還沒有破壞性。當糖溢出時,櫃檯被蓋住。可以把糖擦掉或用吸塵器吸走,還櫃檯本來面貌。與之相對的是,當緩衝區溢出時,過剩的信息覆蓋的是計算機內存中以前的內容。除非這些被覆蓋的內容被保存或能夠恢復,否則就會永遠丟失。

 

 

3、一個是收不回,一個是要的太多給不了,系統負擔不起。

 

什麼是Java中的內存泄露

下面,我們就可以描述什麼是內存泄漏。在Java中,內存泄漏就是存在一些被分配的對象,這些對象有下面兩個特點,首先,這些對象是可達的,即在有向圖中,存在通路可以與其相連;其次,這些對象是無用的,即程序以後不會再使用這些對象。如果對象滿足這兩個條件,這些對象就可以判定爲Java中的內存泄漏,這些對象不會被GC所回收,然而它卻佔用內存。

在C++中,內存泄漏的範圍更大一些。有些對象被分配了內存空間,然後卻不可達,由於C++中沒有GC,這些內存將永遠收不回來。在Java中,這些不可達的對象都由GC負責回收,因此程序員不需要考慮這部分的內存泄露。

通過分析,我們得知,對於C++,程序員需要自己管理邊和頂點,而對於Java程序員只需要管理邊就可以了(不需要管理頂點的釋放)。通過這種方式,Java提高了編程的效率。

因此,通過以上分析,我們知道在Java中也有內存泄漏,但範圍比C++要小一些。因爲Java從語言上保證,任何對象都是可達的,所有的不可達對象都由GC管理。

對於程序員來說,GC基本是透明的,不可見的。雖然,我們只有幾個函數可以訪問GC,例如運行GC的函數System.gc(),但是根據Java語言規範定義, 該函數不保證JVM的垃圾收集器一定會執行。因爲,不同的JVM實現者可能使用不同的算法管理GC。通常,GC的線程的優先級別較低。JVM調用GC的策略也有很多種,有的是內存使用到達一定程度時,GC纔開始工作,也有定時執行的,有的是平緩執行GC,有的是中斷式執行GC。但通常來說,我們不需要關心這些。除非在一些特定的場合,GC的執行影響應用程序的性能,例如對於基於Web的實時系統,如網絡遊戲等,用戶不希望GC突然中斷應用程序執行而進行垃圾回收,那麼我們需要調整GC的參數,讓GC能夠通過平緩的方式釋放內存,例如將垃圾回收分解爲一系列的小步驟執行,Sun提供的HotSpot JVM就支持這一特性。

下面給出了一個簡單的內存泄露的例子。在這個例子中,我們循環申請Object對象,並將所申請的對象放入一個Vector中,如果我們僅僅釋放引用本身,那麼Vector仍然引用該對象,所以這個對象對GC來說是不可回收的。因此,如果對象加入到Vector後,還必須從Vector中刪除,最簡單的方法就是將Vector對象設置爲null。

 

Vector v=new Vector(10);

for (int i=1;i<100; i++)

{

     Object o=new Object();

     v.add(o);

     o=null;

}

 

 

---------------------------***********************————————————————————————

另外一篇

---------------------------***********************————————————————————————

你知道Java內存泄露與溢出的區別,這裏和大家討論一下,Java內存泄漏就是沒有及時清理內存垃圾,導致系統無法再給你提供內存資源(內存資源耗盡);而Java內存溢出就是你要求分配的內存超出了系統能給你的,系統不能滿足需求,於是產生溢出。

Java內存泄露與溢出的區別

內存溢出就是你要求分配的內存超出了系統能給你的,系統不能滿足需求,於是產生溢出。

Java內存泄漏就是沒有及時清理內存垃圾,導致系統無法再給你提供內存資源(內存資源耗盡)。

看到上面的解釋,可能有些朋友還是不太理解吧。沒問題,看以下例子

1.Java內存泄露是說程序邏輯問題,造成申請的內存無法釋放.這樣的話無論多少內存,早晚都會被佔用光的.
最簡單的例子就是死循環了.由於程序判斷錯誤導經常發生此事

2.Java內存泄漏是指在堆上分配的內存沒有被釋放,從而失去對其控制。這樣會造成程序能使用的內存越來越少,導致系統運行速度減慢,嚴重情況會使程序當掉。

3.關於內存溢出有點出入。比如說你申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。
舉個現實中的例子:

比如有一個桶,裝滿了水.你丟個蘋果進去。桶的水正常。如果你放個大石頭。水就出溢出,內存溢出也就是這個原理。

區別:內存溢出,提供的內存不夠;Java內存泄漏,無法再提供內存資源

可能大家會問內存泄露與溢出是考JAVA哪方面?考這個有什麼用?

我個人覺的是考大家對JAVA是怎麼管理內存這一塊的知識?對下是對Java是如何管理內存的解釋

Java是如何管理內存

爲了判斷Java中是否有內存泄露,我們首先必須瞭解Java是如何管理內存的。Java的內存管理就是對象的分配和釋放問題。在Java中,內存的分配是由程序完成的,而內存的釋放是由垃圾收集器(GarbageCollection,GC)完成的,程序員不需要通過調用函數來釋放內存,但它只能回收無用並且不再被其它對象引用的那些對象所佔用的空間。

Java的內存垃圾回收機制是從程序的主要運行對象開始檢查引用鏈,當遍歷一遍後發現沒有被引用的孤立對象就作爲垃圾回收。GC爲了能夠正確釋放對象,必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC都需要進行監控。監視對象狀態是爲了更加準確地、及時地釋放對象,而釋放對象的根本原則就是該對象不再被引用。

在Java中,這些無用的對象都由GC負責回收,因此程序員不需要考慮這部分的內存泄露。雖然,我們有幾個函數可以訪問GC,例如運行GC的函數System.gc(),但是根據Java語言規範定義,該函數不保證JVM的垃圾收集器一定會執行。因爲不同的JVM實現者可能使用不同的算法管理GC。通常GC的線程的優先級別較低。JVM調用GC的策略也有很多種,有的是內存使用到達一定程度時,GC纔開始工作,也有定時執行的,有的是平緩執行GC,有的是中斷式執行GC。但通常來說,我們不需要關心這些。

//此時,所有的Object對象都沒有被釋放,因爲變量v引用這些對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章