linux-buff/cache過大導致內存不足-程序異常

Linux內存使用量超過閾值,使得Java應用程序無可用內存,最終導致程序崩潰。即使在程序沒有掛掉時把程序停掉,系統內存也不會被釋放。

free -h 命令查看內存使用情況。

free -h  

問題出現在Cached的值過大,導致系統沒有可以再分配的內存空間。Cached只要用來緩存文件的,經常讀寫的文件會被緩存到Cached中,可以增加讀寫效率,該功能是Linux系統內核提供的,從2.6.16以後的核心版本才提供,也就是老版的操作系統,如紅旗DC 5.0、RHEL 4.x之前的版本都沒有。這就可以解釋爲什麼我的項目總掛掉了,我的項目主要就是處理文件的,所以接收和下載的文件會被緩存起來,一直耗着內存不釋放,即使把程序停掉也不會釋放內存。最後找到了三條執行,可以清理cached的內存

三條指令:

sync

echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

執行完這三條指令後通過free -h命令查看,free可用內存馬上增多,buff/cache列值變小,說明內存被釋放了,但是不能總是手動的執行這三條指令,所以最後寫了一個shell腳本,開啓Linux定時任務crond,每天早上檢查一次free內存,執行這三條命令.

注意:在執行這三條命令之前一定要先執行sync命令(描述:sync 命令運行 sync 子例程。如果必須停止系統,則運行sync 命令以確保文件系統的完整性。sync 命令將所有未寫的系統緩衝區寫到磁盤中,包含已修改的 i-Node、已延遲的塊 I/O 和讀寫映射文件)


解決方案(自動)

1、編寫shell定時任務腳本freemem.sh
 

#!/bin/sh
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches
               

2、使用crontab -e命令編輯當前用戶的crontab

0 6 * * * /home/jar/freemem.sh


3、重啓crond服務

service crond restart

4、查看crond服務是否重啓成功

service crond status

最後,問題解決。我設定的定時任務是每天早上6點執行一次freemem.sh腳本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章