天天看點

記憶體洩漏和記憶體溢出

什麼是記憶體洩漏,我以前以為是記憶體被人可以拿到裡面内容。

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

記憶體洩漏造成的表現形式是,程序越來越慢。慢的原因是,它申請的記憶體越來越多,沒有釋放掉記憶體。

而作業系統對程序的記憶體占用有限制。作業系統會将大的程序置換到磁盤去。換到磁盤去就導緻速度慢了。

主要是磁盤的速度跟不上。

這讓我聯想到以前自己的系統,變得那麼慢。磁盤原因。

虛拟的記憶體,不是真實占用這麼多實體記憶體。而是需要申請更多記憶體 。作業系統隻能将這樣的程序換到虛拟記憶體中去,虛拟記憶體就是在磁盤的空間。

為什麼記憶體占用越來越多後,就會導緻程序慢呢?根源是什麼?

感覺與記憶體溢出一樣?

應用程式可以申請很多記憶體,作業系統并沒有對程序申請多少記憶體進行限制,也就是說,可以無限度地申請。

為什麼作業系統沒有做限制?不知道!

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

如果沒有更多記憶體可用呢?核心程式就處在等待配置設定中,機器挂起狀态。

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

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

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

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

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

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

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

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

一般一個作業系統上對程序使用記憶體的最大限制是4g。32位作業系統是這樣。

大的程序移動到磁盤需要花費時間(磁盤i/0)

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

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

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

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

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

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

引用計數的變量,隻有在引用數變為0時才釋放掉。

網上說,常見的bug就是沒有将引用計數器減1。導緻沒有釋放掉。

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

一個程序占用20m。怎麼了解這個程序排程呢。

如何調用哪個程序處理呢。

繼續閱讀