初學(xué)者如何熟悉Linux內(nèi)存管理機(jī)制
圖1 Linux虛擬內(nèi)存實(shí)現(xiàn)原理
6.虛擬內(nèi)存容量設(shè)定
也許有人說(shuō),虛擬內(nèi)存容量的設(shè)定應(yīng)該分配2倍于物理內(nèi)存,但這只是個(gè)規(guī)律。如果物理內(nèi)存比較小,可以這樣設(shè)定。如果有256MB物理內(nèi)存或更多的話,就可以縮小虛擬內(nèi)存。Linux會(huì)把大量的內(nèi)存用做Cache,但在資源緊張時(shí)會(huì)收回。只要看到swap為0,或者該數(shù)很小就可以放心了,內(nèi)存放著不用才是最大的浪費(fèi)。
內(nèi)存泄露和回收內(nèi)存的方法
1.內(nèi)存泄漏的定義
一般常說(shuō)的內(nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的、大小任意的(內(nèi)存塊的大小可以在程序運(yùn)行期決定)、使用完后必須顯示釋放的內(nèi)存。應(yīng)用程序一般使用malloc、realloc、new等函數(shù)從堆中分配到一塊內(nèi)存,使用完后,程序必須負(fù)責(zé)相應(yīng)的調(diào)用free或delete釋放該內(nèi)存塊。否則,這塊內(nèi)存就不能被再次使用,我們就說(shuō)這塊內(nèi)存泄漏了。
2.內(nèi)存泄露的危害
從用戶使用程序的角度來(lái)看,內(nèi)存泄漏本身不會(huì)產(chǎn)生什么危害。作為一般的用戶,根本感覺(jué)不到內(nèi)存泄漏的存在。真正有危害的是內(nèi)存泄漏的堆積,這會(huì)最終消耗盡系統(tǒng)所有的內(nèi)存。從這個(gè)角度來(lái)說(shuō),一次性內(nèi)存泄漏并沒(méi)有什么危害,因?yàn)樗粫?huì)堆積。而隱式內(nèi)存泄漏危害性則非常大,因?yàn)檩^之于常發(fā)性和偶發(fā)性內(nèi)存泄漏它更難被檢測(cè)到。存在內(nèi)存泄漏問(wèn)題的程序除了會(huì)占用更多的內(nèi)存外,還會(huì)使程序的性能急劇下降。對(duì)于服務(wù)器而言,如果出現(xiàn)這種情況,即使系統(tǒng)不崩潰,也會(huì)嚴(yán)重影響使用。
3.內(nèi)存泄露的檢測(cè)和回收
對(duì)于內(nèi)存溢出之類的麻煩,大家可能在編寫指針比較多的復(fù)雜程序時(shí)就會(huì)遇到。在Linux或Unix下,C和C++語(yǔ)言是最常使用的工具。但是C++程序缺乏相應(yīng)的手段來(lái)檢測(cè)內(nèi)存信息,只能使用top指令觀察進(jìn)程的動(dòng)態(tài)內(nèi)存總額。而且程序退出時(shí),我們無(wú)法獲知任何內(nèi)存泄漏信息。
(1)使用Linux命令回收內(nèi)存,可以使用ps、kill兩個(gè)命令檢測(cè)內(nèi)存使用情況和進(jìn)行回收。在使用超級(jí)用戶權(quán)限時(shí)使用命令“ps”,它會(huì)列出所有正在運(yùn)行的程序名稱和對(duì)應(yīng)的進(jìn)程號(hào)(PID)。kill命令的工作原理是向Linux操作系統(tǒng)的內(nèi)核送出一個(gè)系統(tǒng)操作信號(hào)和程序的進(jìn)程號(hào)(PID)。
下面舉例說(shuō)明,為了高效率回收內(nèi)存可以使用命令ps參數(shù)v: #ps v
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
2530 vc/1 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty1
2531 vc/2 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty2
2532 vc/3 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty3
2533 vc/4 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty4
2534 vc/5 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty5
2535 vc/6 S 0:00 104 6 1325 408 0.1 /sbin/mingetty tty6
2639 pts/1 S 0:00 545 16 2643 968 0.3 [su]
2684 pts/1 S 0:00 361 5
評(píng)論