1. 程式人生 > >Linux分配記憶體的時候記憶體不足異常處理

Linux分配記憶體的時候記憶體不足異常處理

本文作者:禹明明,叩丁狼高階講師。原創文章,轉載請註明出處。 

在linux上部署專案的時候可能會遇到這麼一個錯誤

Native memory allocation (mmap) failed to map 1879048192 bytes for committing reserved memory

這其實涉及到系統的記憶體的申請策略問題,程式在啟動的時候會先去申請記憶體,儘管不一定都會用的到那麼多. 如果申請時發現無法申請到足夠的記憶體就會報此錯誤. 而我們看到的那麼多的記憶體為什麼申請不到呢? 答案就是被別的程式申請佔用了,儘管這些記憶體沒有實際用到,卻也無法再讓另外的程式進行申請. 我們可以使用以下命令檢視記憶體申請和可用情況

#CommitLimit 表示系統可申請的總記憶體
#Committed_AS為當前已經申請的記憶體
[[email protected] vm]# cat /proc/meminfo | grep Commit
CommitLimit:     3112228 kB
Committed_AS:     907096 kB

如果確定記憶體確實夠用的話我們就可以改變overcommit_memory這個引數的值來保證我們的程式可以正常啟動

overcommit_memory

此引數決定是否接受超大記憶體請求的條件。這個引數有三個可能的值:

  • 0 — 預設設定。核心執行啟發式記憶體過量使用處理,方法是估算可用記憶體量,並拒絕明顯無效的請求。遺憾的是因為記憶體是使用啟發式而非準確演算法計算進行部署,這個設定有時可能會造成系統中的可用記憶體超載。
  • 1 — 核心執行無記憶體過量使用處理。使用這個設定會增大記憶體超載的可能性,但也可以增強大量使用記憶體任務的效能。
  • 2 — 記憶體拒絕等於或者大於總可用 swap 大小以及 overcommit_ratio 指定的物理 RAM 比例的記憶體請求。如果您希望減小記憶體過度使用的風險,這個設定就是最好的。

解決方式:

  1. echo 1 > /proc/sys/vm/overcommit_memory 此方式臨時生效,系統重啟後消失
    1. 編輯/etc/sysctl.conf ,新增vm.overcommit_memory=1,然後sysctl -p 使配置檔案永久生效當然這是我們在開發環境下的解決方式, 在生產環境還是要儘量去優化調整JVM的引數來保證每個程式都有足夠的記憶體來保證執行