Linux 內(nèi)存監(jiān)控內(nèi)存泄露和回收內(nèi)存的方法
從用戶使用程式的角度來看,內(nèi)存泄漏本身不會(huì)產(chǎn)生什么危害,作為一般的用戶,根本感覺不到內(nèi)存泄漏的存在。真正有危害的是內(nèi)存泄漏的堆積,這會(huì)最終消耗盡系統(tǒng)任何的內(nèi)存。以下就介紹下Linux 內(nèi)存監(jiān)控內(nèi)存泄露和回收內(nèi)存的方法。
1、Linux 內(nèi)存監(jiān)控內(nèi)存泄漏的定義:
一般我們常說的內(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)存就不能被再次使用,我們就說這塊內(nèi)存泄漏了。
2、Linux 內(nèi)存監(jiān)控內(nèi)存泄露的危害
從用戶使用程式的角度來看,內(nèi)存泄漏本身不會(huì)產(chǎn)生什么危害,作為一般的用戶,根本感覺不到內(nèi)存泄漏的存在。真正有危害的是內(nèi)存泄漏的堆積,這會(huì)最終消耗盡系統(tǒng)任何的內(nèi)存。從這個(gè)角度來說,一次性內(nèi)存泄漏并沒有什么危害,因?yàn)樗粫?huì)堆積,而隱式內(nèi)存泄漏危害性則很大,因?yàn)檩^之于常發(fā)性和偶發(fā)性內(nèi)存泄漏他更難被檢測(cè)到。存在內(nèi)存泄漏問題的程式除了會(huì)占用更多的內(nèi)存外,還會(huì)使程式的性能急劇下降。對(duì)于服務(wù)器而言,假如出現(xiàn)這種情況,即使系統(tǒng)不崩潰,也會(huì)嚴(yán)重影響使用。
3、Linux 內(nèi)存監(jiān)控內(nèi)存泄露的檢測(cè)和回收
對(duì)于內(nèi)存溢出之類的麻煩可能大家在編寫指針比較多的復(fù)雜的程式的時(shí)候就會(huì)碰到。在 Linux 或 unix 下,C、C++語言是最使用工具。但是我們的 C++ 程式缺乏相應(yīng)的手段來檢測(cè)內(nèi)存信息,而只能使用 top 指令觀察進(jìn)程的動(dòng)態(tài)內(nèi)存總額。而且程式退出時(shí),我們無法獲知任何內(nèi)存泄漏信息。
使用kill命令
使用Linux命令回收內(nèi)存,我們能夠使用Ps、Kill兩個(gè)命令檢測(cè)內(nèi)存使用情況和進(jìn)行回收。在使用***用戶權(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)。
應(yīng)用例子:
為了高效率回收內(nèi)存能夠使用命令ps 參數(shù)v:
[root@www ~]# ps v
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
2542 tty1Ss+ 0:00 08 1627 428 0.1 /sbin/mingetty tty1
2543 tty2Ss+ 0:00 08 1631 428 0.1 /sbin/mingetty tty2
2547 tty3Ss+ 0:00 08 1631 432 0.1 /sbin/mingetty tty3
2548 tty4Ss+ 0:00 08 1627 428 0.1 /sbin/mingetty tty4
2574 tty5Ss+ 0:00 08 1631 432 0.1 /sbin/mingetty tty5
2587 tty6Ss+ 0:00 08 1627 424 0.1 /sbin/mingetty tty6
2657 tty7Ss+ 1:1812 1710 29981 7040 3.0 /usr/bin/Xorg :0 -br -a
2670 pts/2 Ss0:01 2 682 6213 1496 0.6 -bash
3008 pts/4 Ss0:00 2 682 6221 1472 0.6 /bin/bash
3029 pts/4 S+0:00 2 32 1783 548 0.2 ping 192.168.1.12
3030 pts/2 R+0:00 2 73 5134 768 0.3 ps v
然后假如想回收Ping命令的內(nèi)存的話,使用命令:
# Kill -9 3029
【編輯推薦】