Linux内存申请机制
?
在linux上部署項目的時候可能會遇到這么一個錯誤,明明有內存,但是報Segment fault的內存錯誤,是什么原因呢?
錯誤原因毫無疑問就是分配內存的時候內存不足,但是使用free 命令去查看系統(tǒng)的內存占用卻發(fā)現(xiàn)此時還有很多內存可用.
再使用 ulimit -a 發(fā)現(xiàn)內存也并沒有被限制.
我們最終還是在RedHat上找到了答案,需要優(yōu)化系統(tǒng)性能或者深入了解RedHat系列的可以去看看:
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/performance_tuning_guide/
這其實涉及到系統(tǒng)的內存的申請策略問題,程序在啟動的時候會先去申請內存,盡管不一定都會用的到那么多.
如果申請時發(fā)現(xiàn)無法申請到足夠的內存就會報此錯誤. 而我們看到的那么多的內存為什么申請不到呢? 答案就是被別的程序申請占用了,盡管這些內存沒有實際用到,卻也無法再讓另外的程序進行申請.
我們可以使用以下命令查看內存申請和可用情況
?
#CommitLimit 表示系統(tǒng)可申請的總內存 #Committed_AS為當前已經申請的內存 [root@localhost vm]# cat /proc/meminfo | grep Commit CommitLimit: 3112228 kB Committed_AS: 907096 kB如果確定內存確實夠用的話我們就可以改變overcommit_memory這個參數(shù)的值來保證我們的程序可以正常啟動。
overcommit_memory
? ? 0:默認設置。
? ? ? ? ?進程申請內存時,系統(tǒng)會判斷剩余內存多少,
? ? ? ? ?如果有足夠的內存,則允許申請,否則會把報錯返回給進程。
? ? 1:進程申請內存時,系統(tǒng)允許分配所有物理內存(不考慮當前內存剩余),
? ? ? ? ?當使用內存超過可用內存時再報錯。
? ? 2:進程申請內存時,系統(tǒng)不允許分配大于swap空間大小以及overcommit_ratio比例大小的總和。
? ? ? ? ?overcommit_ratio比例默認50。
overcommit_ratio參數(shù):
? ? 當overcommit_memory=2時,該參數(shù)才生效。該參數(shù)決定了系統(tǒng)可用內存的大小。
? ? 它有一套專門的計算公式: 可分配大小=物理內存大小*overcommit_ratio/100+swap
? ??
修改內核參數(shù)的方法:(三種都可以)
? ? 方法一:
? ? ? ? # vim /etc/sysctl.conf
? ? ? ? ? ?vm.overcommit_memory=1 ? ? ? ? ? ?//有則更改,無則添加
? ? ? ? # sysctl -p ? ? ? ? ? //使配置文件生效
? ? ? ??
? ? 方法二:
? ? ? ? # sysctl vm.overcommit_memory=1
? ? ? ??
? ? 方法三:
? ? ? ? # echo 1 > /proc/sys/vm/overcommit_memory ?
?
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Linux内存申请机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国电子协会考评中心_中国电子学会考评中
- 下一篇: Linux服务器与windows本地之间