在最近的Java web項目中,進行資源文件轉換時,當Linux物理內存過小時,總會轉換失敗,是因爲當在Linux下頻繁存取文件後,物理內存會很快被用光,當程序結束後,內存不會被正常釋放,而是一直作爲caching。這個問題,貌似有不少人在問,不過都沒有看到有什麼很好解決的辦法。那麼我來談談這個問題。
先來說說free命令:
[root@docker12 /]# free -m
total used free shared buffers cached
Mem: 7857 7671 186 0 41 1472
-/+ buffers/cache: 6157 1699
Swap: 8127 5556 257
其中,
total 內存總數
used 已經使用的內存數
free 空閒的內存數
shared 多個進程共享的內存總額
buffers Buffer Cache和cached Page Cache 磁盤緩存的大小
-buffers/cache 的內存數:used – buffers – cached
+buffers/cache 的內存數:free + buffers + cached
可用的memory=free memory+buffers+cached
爲了提高磁盤存取效率,Linux做了一些精心的設計,除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換),還採取了兩種主要Cache
方式:Buffer Cache和Page Cache。前者針對磁盤塊的讀寫,後者針對文件inode的讀寫。這些Cache有效縮短了 I/O系統調用(比如read,write,ge
tdents)的時間。
手工釋放內存:
/proc是一個虛擬文件系統,我們可以通過對它的讀寫操作做爲與kernel實體間進行通信的一種手段。也就是說可以通過修改/proc中的文件,來對當前kernel的行爲做出調整。那麼我們可以通過調整/proc/sys/vm/drop_caches來釋放內存。操作如下:
[root@docker12 /]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys/vm/drop_caches的值,默認爲0。
[root@docker12 /]# sync
手動執行sync命令(描述:sync 命令運行 sync 子例程。如果必須停止系統,則運行sync 命令以確保文件系統的完整性。sync 命令將所有未寫的系統緩衝區寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件)
[root@docker12 /]# echo 3 > /proc/sys/vm/drop_caches
[root@docker12 /]# cat /proc/sys/vm/drop_caches
3
將/proc/sys/vm/drop_caches值設爲3,再執行free命令,查看內存:
[root@docker12 /]# free -m
total used free shared buffers cached
Mem: 7857 7349 508 0 2 1193
-/+ buffers/cache: 6152 1704
Swap: 8127 5580 2547