記憶體洩漏和記憶體溢位

王滔發表於2015-07-11
 
 
 
什麼是記憶體洩漏,我以前以為是記憶體被人可以拿到裡面內容。

現在發現概念是記憶體區域沒有釋放掉。

記憶體洩漏造成的表現形式是,程式越來越慢。慢的原因是,它申請的記憶體越來越多,沒有釋放掉記憶體。
而作業系統對程式的記憶體佔用有限制。作業系統會將大的程式置換到磁碟去。換到磁碟去就導致速度慢了。
主要是磁碟的速度跟不上。

這讓我聯想到以前自己的系統,變得那麼慢。磁碟原因。
虛擬的記憶體,不是真實佔用這麼多實體記憶體。而是需要申請更多記憶體 。作業系統只能將這樣的程式換到虛擬記憶體中去,虛擬記憶體就是在磁碟的空間。

 
 
 
為什麼記憶體佔用越來越多後,就會導致程式慢呢?根源是什麼?


感覺與記憶體溢位一樣?

應用程式可以申請很多記憶體,作業系統並沒有對程式申請多少記憶體進行限制,也就是說,可以無限度地申請。
為什麼作業系統沒有做限制?不知道!

作業系統沒有做限制,需要的時候就分配記憶體,這就是動態建立記憶體叫法的本義。


如果沒有更多記憶體可用呢?核心程式就處在等待分配中,機器掛起狀態。

這是虛擬記憶體,作業系統沒有更多記憶體申請,就會排程。

這個排程演算法是怎麼算的呢?

 

一個是儲存的資料,記憶體存不下了。

溢位,想象裝水的容器,水裝不下就會溢位。記憶體也是這樣。

為什麼有些解釋法是,記憶體區域沒有指標指向它。這種記憶體空間就是記憶體洩漏。

Linux上有什麼工具可以檢測記憶體洩漏呢?

原理是不是檢測核心對記憶體的申請,有沒有處在等待中種。申請不到記憶體就會是等待中。

思路是檢測核心。核心的呼叫非常頻繁。可以實時監測到。
 
 




一般一個作業系統上對程式使用記憶體的最大限制是4g。32位作業系統是這樣。
大的程式移動到磁碟需要花費時間(磁碟i/0)

 

如何才能讓自己用這個知識解決php的問題呢。

記憶體洩漏,將記憶體耗盡。什麼情況會?因為沒有釋放掉。


記憶體溢位,申請不到可用的記憶體。


為什麼站在作業系統的角度來說洩漏的呢?


參考http://m.111cn.net/art-55371.htm。

Bad-gatway,表示的是很累。而502則是超時。
 


引用計數的變數,只有在引用數變為0時才釋放掉。
網上說,常見的bug就是沒有將引用計數器減1。導致沒有釋放掉。

有垃圾回收機制可以讓程式設計師省心。關鍵是這個垃圾回收機制要怎麼設計。刪除引用數為0的變數?

一個程式佔用20m。怎麼理解這個程式排程呢。


如何呼叫哪個程式處理呢。



 
 
 
 

相關文章