在linux系統下,我們一般不需要去釋放記憶體,因為系統已經將記憶體管理的很好。但是凡事也有例外,有的時候記憶體會被快取占用掉,導致系統使用swap空間影響效能,此時就需要執行釋放記憶體(清理快取)的操作了。
linux系統的快取機制是相當先進的,他會針對dentry(用於vfs,加速檔案路徑名到inode的轉換)、buffer cache(針對磁碟塊的讀寫)和page cache(針對檔案inode的讀寫)進行快取操作。但是在進行了大量檔案操作之後,快取會把記憶體資源基本用光。但實際上我們檔案操作已經完成,這部分快取已經用不到了。這個時候,我們難道只能眼睜睜的看著快取把記憶體空間佔據掉麼?
關於記憶體耗盡的總結:
1)在程序收到oom之前,核心將重新整理檔案系統的cache來釋放空間.
2)將交換區的頁面移到磁碟上.
3)當記憶體變少時,虛擬性使每個程序通過交換區來做簡單的上下文環境切換.
4)當程序消耗盡交換記憶體後,才會引發out-of-memory(oom)來kill那些程序.
所以,我們還是有必要來手動進行linux下釋放記憶體的操作,其實也就是釋放快取的操作了。
要達到釋放快取的目的,我們首先需要了解下關鍵的配置檔案/proc/sys/vm/drop_caches。這個檔案中記錄了快取釋放的引數,預設值為0,也就是不釋放快取。他的值可以為0~3之間的任意數字,代表著不同的含義:
0 – 不釋放
1 – 釋放頁快取
2 – 釋放dentries和inodes
3 – 釋放所有快取
知道了引數後,我們就可以根據我們的需要,使用下面的指令來進行操作。
首先我們需要使用sync指令,將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 i/o 和讀寫對映檔案。否則在釋放快取的過程中,可能會丟失未儲存的檔案。
#sync
接下來,我們需要將需要的引數寫進/proc/sys/vm/drop_caches檔案中,比如我們需要釋放所有快取,就輸入下面的命令:
#echo 3 > /proc/sys/vm/drop_caches
此指令輸入後會立即生效,可以查詢現在的可用記憶體明顯的變多了。
要查詢當前快取釋放的引數,可以輸入下面的指令:
#cat /proc/sys/vm/drop_caches
swap的概述
swap的作用可簡單描述為:
當記憶體不夠用時,將儲存器中的資料塊從dram移到swap的磁碟空間中,以釋放更多的空間給當前程序使用.
當再次需要那些資料時,就可以將swap磁碟中的資料重新移到記憶體,而將那些不用的資料塊從記憶體移到swap中.
資料從記憶體移動交換區的行為被稱為頁面呼叫,發生在後台的頁面呼叫沒有來自應用程式的干涉.
swap空間是分頁的,每一頁的大小和記憶體頁的大小一樣.
並不是一定要給每個系統劃分swap,比如大多數的嵌入式就沒有swap.
##在執行以上操作以後,檢視你的swap分割槽還是滿了,你首先檢視一下你實際的記憶體剩多少空間,然後在檢視自己的swap空間用了多少,首先提前保證實際剩餘的記憶體比你的swap的記憶體的空間要大,然後執行一下操作,否則會宕機的!
首先我們停掉swap分割槽,檢視swap分割槽
swapon -s 會檢視到你的swap分割槽是掛在**!
然後比如說我的是掛到/dev/sda2
swapoff /dev/sda2
停止是需要一段時間的,因為他會把記憶體釋放到實際記憶體當中,
然後在啟動我們的swap分割槽
swapon -a
我們的swap分割槽記憶體已經成功釋放到了實際記憶體當中!
例項:首先參看swap使用情況:
[root@xx ~]#free -m
total used free shared buffers cached
mem: 64369 9080 55288 2124 4 2404
-/+buffers/cache: 6671 57697
swap: 2048 1130 917
對於這種情況,明顯機器的記憶體很夠用,保證實際剩餘的記憶體比你的
swap
的記憶體的空間要大!
檢視swap分割槽的位置:
[root@xx ~]#swapon -s
filename type size used priority
/dev/sda2 partition 2097404 0 -1
停掉swap分割槽:
[root@xx ~]#swapoff /dev/sda2
停止是需要一段時間的,因為它會把記憶體釋放到實際記憶體當中。
然後在啟動我們的swap分割槽
swapon -a
再次檢視:
[root@xx ~]#free -m
total used free shared buffers cached
mem: 64369 11432 52936 2158 37 4023
-/+buffers/cache: 7371 56997
swap: 2048 0 2048
我們的swap分割槽記憶體已經成功釋放到了實際記憶體當中!
補充:也可以寫shell統計所以程序使用swap的情況!
#!/bin/bash
# get current swap usage for all running processes
# writted by xx
function getswap '`
do
let sum=$sum+$swap
done
echo "pid=$pid - swap used: $sum - ($progname )"
let overall=$overall+$sum
sum=0
done
echo "overall swap used: $overall"
getswap
#getswap|egrep -v "swap used: 0"
Linux下釋放記憶體
在linux系統下,我們一般不需要去釋放記憶體,因為系統已經將記憶體管理的很好。但是凡事也有例外,有的時候記憶體會被快取占用掉,導致系統使用swap空間影響效能,此時就需要執行釋放記憶體 清理快取 的操作了。linux系統的快取機制是相當先進的,他會針對dentry 用於vfs,加速檔案路徑名到in...
Linux下釋放記憶體
當在linux下頻繁訪問檔案後,物理記憶體會很快被用光,當程式結束後,記憶體不會被正常釋放,而是一直作為caching,因此我們很有必要手動清理系統快取釋放記憶體。第一步我們在清理快取前應該先執行sync。因為系統在操作的過程當中,會把你的操作到的檔案資料先儲存到buffer中去,因為怕你在操作的過...
Linux下如何釋放記憶體
在linux系統下,我們一般不需要去釋放記憶體,因為系統已經將記憶體管理的很好。但是凡事也有例外,有的時候記憶體會被快取占用掉,導致系統使用swap空間影響效能,此時就需要執行釋放記憶體 清理快取 的操作了。linux系統的快取機制是相當先進的,他會針對dentry 用於vfs,加速檔案路徑名到in...