1. 程式人生 > 實用技巧 >如何手動釋放linux記憶體

如何手動釋放linux記憶體

在Linux系統下,我們一般不需要去釋放記憶體,因為系統已經將記憶體管理的很好。但是凡事也有例外,有的時候記憶體會被快取佔用掉,導致系統使用SWAP空間影響效能,此時就需要執行釋放記憶體(清理快取)的操作了。

Linux系統的快取機制是相當先進的,他會針對dentry(用於VFS,加速檔案路徑名到inode的轉換)、Buffer Cache(針對磁碟塊的讀寫)和Page Cache(針對檔案inode的讀寫)進行快取操作。但是在進行了大量檔案操作之後,快取會把記憶體資源基本用光。但實際上我們檔案操作已經完成,這部分快取已經用不到了。這個時候,我們難道只能眼睜睜的看著快取把記憶體空間佔據掉麼?

所以,我們還是有必要來手動進行Linux下釋放記憶體的操作,其實也就是釋放快取的操作了。

要達到釋放快取的目的,我們首先需要了解下關鍵的配置檔案/proc/sys/vm/drop_caches。這個檔案中記錄了快取釋放的引數,預設值為0,也就是不釋放快取。他的值可以為0~3之間的任意數字,代表著不同的含義:

0 – 不釋放 預設值為0
1 – 釋放頁快取
2 – 釋放dentries和inodes
3 – 釋放所有快取

知道了引數後,我們就可以根據我們的需要,使用下面的指令來進行操作。

首先我們需要使用sync指令,將所有未寫的系統緩衝區寫到磁碟中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫對映檔案。否則在釋放快取的過程中,可能會丟失未儲存的檔案。

說明,釋放前最好sync一下,防止丟資料。

#sync

 接下來,我們需要將需要的引數寫進/proc/sys/vm/drop_caches檔案中,比如我們需要釋放所有快取,就輸入下面的命令:

#echo 3 > /proc/sys/vm/drop_caches

此指令輸入後會立即生效,可以查詢現在的可用記憶體明顯的變多了。

要查詢當前快取釋放的引數,可以輸入下面的指令:

#cat /proc/sys/vm/drop_caches

釋放完記憶體後改回去讓系統重新自動分配記憶體

echo 0 >/proc/sys/vm/drop_caches
[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          
7979 7897 82 0 30 3918 -/ buffers/cache: 3948 4031 Swap: 4996 438 4558

第一行用全域性角度描述系統使用的記憶體狀況:
total 記憶體總數
used 已經使用的記憶體數,一般情況這個值會比較大,因為這個值包括了cache 應用程式使用的記憶體
free 空閒的記憶體數
shared 多個程序共享的記憶體總額
buffers 快取,主要用於目錄方面,inode值等(ls大目錄可看到這個值增加)
cached 快取,用於已開啟的檔案

第二行描述應用程式的記憶體使用:
-buffers/cache 的記憶體數:used - buffers - cached
buffers/cache 的記憶體數:free buffers cached
前個值表示-buffers/cache 應用程式使用的記憶體大小,used減去快取值
後個值表示 buffers/cache 所有可供應用程式使用的記憶體大小,free加上快取值

第三行表示swap的使用:
used 已使用
free 未使用

為什麼free這麼小,是否關閉應用後記憶體沒有釋放?
實際上,這是因為Linux對記憶體的管理與Windows不同,free小並不是說記憶體不夠用了,應該看的是free的第二行最後一個值:-/ buffers/cache: 39484031,這才是系統可用的記憶體大小。

實際專案中的經驗告訴我們,如果因為是應用有像記憶體洩露、溢位的問題,從swap的使用情況可比較快速判斷的,但free上反而比較難檢視。既然核心是可快速清空buffer或cache,但核心並沒有這樣做(預設值是0),不應隨便去改變它。

一般情況下,應用在系統上穩定運行了,free值也會保持在一個穩定值的,雖然看上去可能比較小。當發生記憶體不足、應用獲取不到可用記憶體、OOM錯誤等問題時,更應該去分析應用方面的原因,如使用者量太大導致記憶體不足、發生應用記憶體溢位等情況,否則,清空buffer,強制騰出free的大小,可能只是把問題給暫時遮蔽了,所以說一般情況下linux都不用經常手動釋放記憶體。