附件2:內存泄漏memory leak和內存溢出out of memory

http://www.cnblogs.com/fryy/archive/2013/11/27/3445281.html

內存泄漏指你用malloc或new申請了一塊內存,但是沒有通過free或delete將內存釋放,導致這塊內存一直處於佔用狀態

內存溢出指你申請了10個字節的空間,但是你在這個空間寫入11或以上字節的數據,就是溢出

要點

  • 內存泄露是指程序中間動態分配了內存,但在程序結束時沒有釋放這部分內存,從而造成那部分內存不可用的情況,重啓計算機可以解決,但也有可能再次發生內存泄露,內存泄露和硬件沒有關係,它是由軟件設計缺陷引起的。 

  • 內存泄漏可以分爲4類:

1)常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。

2)偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。

3)一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存泄漏只會發生一次。

4)隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這裏並沒有發生內存泄漏,因爲最終程序釋放了所有申請的內存。但是對於一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏爲隱式內存泄漏。

  • 內存溢出即用戶在對其數據緩衝區操作時,超過了其緩衝區的邊界;尤其是對緩衝區寫操作時,緩衝區的溢出很可能導致程序的異常。

  • 內存溢出類型:

1)java.lang.OutOfMemoryError:PermGen space

PermGen space 的全稱是 Permanent Generation space,是指內存的永久保存區域。這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGenspace中,它和存放類實例(Instance)的Heap區域不同,GC不會在主程序運行期對PermGenspace進行清理。

 

JVM由XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;

JVM由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。

該錯誤常見場合:

a) 應用中有很多Class,web服務器對JSP進行pre compile時。

b) Webapp下用了大量的第三方jar, 其大小超過了JVM默認的大小(4M)時。

2)java.lang.OutOfMemoryError:Java heap space

在JVM中如果98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出此異常信息。

JVM初始分配的內存由-Xms指定,默認是物理內存的1/64; 

JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。 

JVM內存的最大值跟操作系統有很大的關係。32位處理器雖然可控內存空間有4GB,但是具體的操作系統會給一個限制,這個限制一般是2GB-3GB(一般來說Windows系統下爲1.5G-2G,Linux系統下爲2G-3G),而64bit以上的處理器就不會有限制了。

注意:如果Xms超過了Xmx值,或者堆最大值和非堆最大值的總和超過了物理內存或者操作系統的最大限制都會引起服務器啓動不起來。 

該錯誤常見場合:

a) Web上傳文件時。

b) 開啓大型文件或從數據庫中一次取了太多的數據。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章