先摘抄維基百科的一段關於虛擬內存的解釋算法
虛擬內存是計算機系統內存管理的一種技術。它使得應用程序認爲它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它一般是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在須要時進行數據交換。與沒有使用虛擬內存技術的系統相比,使用這種技術的系統使得大型程序的編寫變得更容易,對真正的物理內存(例如RAM)的使用也更有效率。shell
注意:虛擬內存不僅是「用磁盤空間來擴展物理內存」的意思——這只是擴充內存級別以使其包含硬盤驅動器而已。把內存擴展到磁盤只是使用虛擬內存技術的一個結果,它的做用也能夠經過覆蓋或者把處於不活動狀態的程序以及它們的數據所有交換到磁盤上等方式來實現。對虛擬內存的定義是基於對地址空間的重定義的,即把地址空間定義爲「連續的虛擬內存地址」,以藉此「欺騙」程序,使它們覺得本身正在使用一大塊的「連續」地址。緩存
接下來說講Linux是如何管理內存的app
在Linux裏(別的系統也差很少),內存有物理內存和虛擬內存之說,物理內存是什麼天然無需解釋,虛擬內存實際是物理內存的抽象,多數狀況下,出於方便性的考慮,程序訪問的都是虛擬內存地址,而後操做系統會經過Page Table機制把它翻譯成物理內存地址,詳細說明能夠參考Understanding Memory和Understanding Virtual Memory,至於程序是如何使用虛擬內存的,能夠參考Playing with Virtual Memory,這裏就很少費口舌了。ide
不少人會把虛擬內存和Swap混爲一談,實際上Swap只是虛擬內存引伸出的一種技術而已:操做系統一旦物理內存不足,爲了騰出內存空間存放新內容,就會把當前物理內存中的內容放到交換分區裏,稍後用到的時候再取回來,須要注意的是,Swap的使用可能會帶來性能問題,偶爾爲之無需緊張,糟糕的是物理內存和交換分區頻繁的發生數據交換,這被稱之爲Swap顛簸,一旦發生這種狀況,先要明確是什麼緣由形成的,若是是內存不足就好辦了,加內存就能夠解決,不過有的時候即便內存充足也可能會出現這種問題,好比MySQL就有可能出現這樣的狀況,一個可選的解決方法是限制使用Swap:性能
shell> sysctl vm.swappiness=0操作系統
查看內存狀況最經常使用的是free命令:翻譯
shell> free -m total used free shared buffers cached Mem: 32101 29377 2723 0 239 25880 -/+ buffers/cache: 3258 28842 Swap: 2047 0 2047
新手看到used一欄數值偏大,free一欄數值偏小,每每會認爲內存要用光了。其實並不是如此,之因此這樣是由於每當咱們操做文件的時候,Linux都會盡量的把文件緩存到內存裏,這樣下次訪問的時候,就能夠直接從內存中取結果,因此cached一欄的數值很是的大,不過不用擔憂,這部份內存是可回收的,操做系統的虛擬內存管理器會按照LRU算法淘汰冷數據。還有一個buffers,也是可回收的,不過它是保留給塊設備使用的。內存
知道了原理,咱們就能夠推算出系統可用的內存是free + buffers + cached:it
shell> echo $((2723 + 239 + 25880)) 28842
至於系統實際使用的內存是used – buffers – cached:
shell> echo $((29377 - 239 - 25880)) 3258
除了free命令,還可使用sar命令:
shell> sar -r kbmemfree kbmemused %memused kbbuffers kbcached 3224392 29647732 90.19 246116 26070160 shell> sar -W pswpin/s pswpout/s 0.00 0.00
但願你沒有被%memused嚇到,若是不幸言中,重讀本文。