Linux内存管理机制研究
生活随笔
收集整理的這篇文章主要介紹了
Linux内存管理机制研究
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Linux內(nèi)存管理機制研究
查看linux系統(tǒng)中處于free狀態(tài)的內(nèi)存有兩個角度,一個是從內(nèi)核的角度來看,一個是從應(yīng)用層的角度來看的。 1.從內(nèi)核的角度來看free的內(nèi)存,就是內(nèi)核目前可以直接分配到,不需要額外的操作,這個free值是不包括系統(tǒng)中處于buffer和cache狀態(tài)的內(nèi)存;但是在內(nèi)核需要時,或在系統(tǒng)運行逐步推進時,buffer和cache狀態(tài)的內(nèi)存可以變?yōu)閒ree狀態(tài)的內(nèi)存。 2.從應(yīng)用層的角度來看系統(tǒng)處于free狀態(tài)的內(nèi)存,這個值是包括處于buffer和cache的,所以應(yīng)用層分配內(nèi)存時,可以直接從buffer和cache中拿。
IXDBA.NET社區(qū)論壇 linux系統(tǒng)之所以提高這種機制,是因為把內(nèi)存都置為free狀態(tài),還不如把最近使用過的內(nèi)存緩存起來(如從磁盤中讀取的數(shù)據(jù)),這樣再次需要這些數(shù)據(jù)時可以直接從內(nèi)存中取,而不需要有一個漫長的磁盤操作,這樣可以提高系統(tǒng)的整體性能。因為free狀態(tài)的內(nèi)存中的內(nèi)容是不可用的,與其閑置還不如發(fā)揮它們的作用。而在系統(tǒng)需要時,又可以快速的從這些可釋放的內(nèi)存中分配,我想這種機制是非常好的。
下面我們來看看free命令的結(jié)果: total?????? used?????? free???? shared??? buffers???? cached
Mem:?????????? 500??????? 355??????? 145????????? 0????????? 67??????????? 249
-/+ buffers/cache:?????? 38???????? 462
Swap:????????? 996????????? 1??????? 994 在這個結(jié)果中的第一行是從內(nèi)核角度來看系統(tǒng)內(nèi)存使用狀態(tài)的,可以看到free的內(nèi)存只有145M;
第二行是從應(yīng)用層的角度來看系統(tǒng)內(nèi)存的使用狀況,可以看到free的內(nèi)存有462M; 你有沒有看到462這個值的妙處呢????462 := 145 + 249 + 67 實例二:在Linux下查看內(nèi)存我們一般用command free;
[root@nonamelinux ]# free
total???? used??? free? shared?? buffers??? cached;
Mem:?????? 386024?? 377116?? 8908??? 0?????? 21280????? 155468;
-/+ buffers/cache:? 200368? 185656;
Swap:????? 393552???? 0???? 393552; 下面是對這些數(shù)值的解釋:
total:總計物理內(nèi)存的大小。
used:已使用多大。
free:可用有多少。
Shared:多個進程共享的內(nèi)存總額。
Buffers/cached:磁盤緩存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解釋了。 區(qū)別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區(qū)別。 這兩個的區(qū)別在于使用的角度來看,第一行是從OS的角度來看,因為對于OS,buffers/cached 都是屬于被使用,所以他的可用內(nèi)存是8908KB,已用內(nèi)存是377116KB,其中包括,內(nèi)核(OS)使用+Application(X,oracle,etc)使用的+buffers+cached. 第三行所指的是從應(yīng)用程序角度來看,對于應(yīng)用程序來說,buffers/cached 是等于可用的,因為buffer/cached是為了提高文件讀取的性能,當(dāng)應(yīng)用程序需在用到內(nèi)存的時候,buffer/cached會很快地被回收。 所以從應(yīng)用程序的角度來說,可用內(nèi)存=系統(tǒng)free memory+buffers+cached。 如上例:
185656=8908+21280+155468
接下來解釋什么時候內(nèi)存會被交換,以及按什么方交換。 當(dāng)可用內(nèi)存少于額定值的時候,就會開會進行交換。 如何看額定值(RHEL4.0):
#cat /proc/meminfo 交換將通過三個途徑來減少系統(tǒng)中使用的物理頁面的個數(shù):
1.減少緩沖與頁面cache的大小,
2.將系統(tǒng)V類型的內(nèi)存頁面交換出去,
3.換出或者丟棄頁面。(Application 占用的內(nèi)存頁,也就是物理內(nèi)存不足)。 事實上,少量地使用swap是不會影響到系統(tǒng)性能的。 下面是buffers與cached的區(qū)別。 buffers是指用來給塊設(shè)備做的緩沖大小,他只記錄文件系統(tǒng)的metadata以及 tracking in-flight pages. cached是用來給文件做緩沖。
那就是說:buffers是用來存儲,目錄里面有什么內(nèi)容,權(quán)限等等。而cached直接用來記憶我們打開的文件,如果你想知道他是不是真的生效,你可以試一下,先后執(zhí)行兩次命令#man X ,你就可以明顯的感覺到第二次的開打的速度快很多。 實驗:在一臺沒有什么應(yīng)用的機器上做會看得比較明顯。記得實驗只能做一次,如果想多做請換一個文件名。
#free
#man X
#free
#man X
#free 你可以先后比較一下free后顯示buffers的大小。 另一個實驗:
#free
#ls /dev
#free 你比較一下兩個的大小,當(dāng)然這個buffers隨時都在增加,但你有l(wèi)s過的話,增加的速度會變得快,這個就是buffers/chached的區(qū)別。 實例三:
linux 優(yōu)先使用物理內(nèi)存,當(dāng)物理內(nèi)存還有空閑時,linux是不會施放內(nèi)存的,即時占用內(nèi)存的程序已經(jīng)被關(guān)閉了(這部分內(nèi)存就用來做緩存了)。也就是說,即時你有2G的內(nèi)存,用過一段時間后,也會被占滿。這樣做的好處是,啟動那些剛開啟過的程序、或是讀取剛存取過得數(shù)據(jù)會比較快,對于服務(wù)器很有好處。 你可以用 free 指令查看一下輸出,用 used 減去 buffer 和 cache,才是你運行中的程序所占用的空間,這是我的輸出:
total???? used????? free??? shared?? buffers??? cached
Mem:?? 516300?? 504264? 12036???? 0?????? 88396??? 236792
-/+ buffers/cache: 179076 337224
Swap: 1544184 21276 1522908 504264 - 88396 - 236792 = 179076
也就是說目前正在被使用的內(nèi)存只有 179 兆。不要被 504兆的used嚇住了。 windows則總是給內(nèi)存留下一定的空閑空間,即時內(nèi)存有空閑也會讓程序使用一些虛擬內(nèi)存,這樣做的好處是,啟動新的程序比較快,直接分給它些空閑內(nèi)存就可以了,而linux下呢?由于內(nèi)存經(jīng)常處于全部被使用的狀態(tài),則要先清理出一塊內(nèi)存,再分配給新的程序使用,因此,新程序的啟動會慢一些。 另外,內(nèi)存是隨機訪問的,也就是說,無論你的內(nèi)存占用了多少,數(shù)據(jù)的存取時間都是相同的,跟硬盤不同
查看linux系統(tǒng)中處于free狀態(tài)的內(nèi)存有兩個角度,一個是從內(nèi)核的角度來看,一個是從應(yīng)用層的角度來看的。 1.從內(nèi)核的角度來看free的內(nèi)存,就是內(nèi)核目前可以直接分配到,不需要額外的操作,這個free值是不包括系統(tǒng)中處于buffer和cache狀態(tài)的內(nèi)存;但是在內(nèi)核需要時,或在系統(tǒng)運行逐步推進時,buffer和cache狀態(tài)的內(nèi)存可以變?yōu)閒ree狀態(tài)的內(nèi)存。 2.從應(yīng)用層的角度來看系統(tǒng)處于free狀態(tài)的內(nèi)存,這個值是包括處于buffer和cache的,所以應(yīng)用層分配內(nèi)存時,可以直接從buffer和cache中拿。
IXDBA.NET社區(qū)論壇 linux系統(tǒng)之所以提高這種機制,是因為把內(nèi)存都置為free狀態(tài),還不如把最近使用過的內(nèi)存緩存起來(如從磁盤中讀取的數(shù)據(jù)),這樣再次需要這些數(shù)據(jù)時可以直接從內(nèi)存中取,而不需要有一個漫長的磁盤操作,這樣可以提高系統(tǒng)的整體性能。因為free狀態(tài)的內(nèi)存中的內(nèi)容是不可用的,與其閑置還不如發(fā)揮它們的作用。而在系統(tǒng)需要時,又可以快速的從這些可釋放的內(nèi)存中分配,我想這種機制是非常好的。
下面我們來看看free命令的結(jié)果: total?????? used?????? free???? shared??? buffers???? cached
Mem:?????????? 500??????? 355??????? 145????????? 0????????? 67??????????? 249
-/+ buffers/cache:?????? 38???????? 462
Swap:????????? 996????????? 1??????? 994 在這個結(jié)果中的第一行是從內(nèi)核角度來看系統(tǒng)內(nèi)存使用狀態(tài)的,可以看到free的內(nèi)存只有145M;
第二行是從應(yīng)用層的角度來看系統(tǒng)內(nèi)存的使用狀況,可以看到free的內(nèi)存有462M; 你有沒有看到462這個值的妙處呢????462 := 145 + 249 + 67 實例二:在Linux下查看內(nèi)存我們一般用command free;
[root@nonamelinux ]# free
total???? used??? free? shared?? buffers??? cached;
Mem:?????? 386024?? 377116?? 8908??? 0?????? 21280????? 155468;
-/+ buffers/cache:? 200368? 185656;
Swap:????? 393552???? 0???? 393552; 下面是對這些數(shù)值的解釋:
total:總計物理內(nèi)存的大小。
used:已使用多大。
free:可用有多少。
Shared:多個進程共享的內(nèi)存總額。
Buffers/cached:磁盤緩存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解釋了。 區(qū)別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區(qū)別。 這兩個的區(qū)別在于使用的角度來看,第一行是從OS的角度來看,因為對于OS,buffers/cached 都是屬于被使用,所以他的可用內(nèi)存是8908KB,已用內(nèi)存是377116KB,其中包括,內(nèi)核(OS)使用+Application(X,oracle,etc)使用的+buffers+cached. 第三行所指的是從應(yīng)用程序角度來看,對于應(yīng)用程序來說,buffers/cached 是等于可用的,因為buffer/cached是為了提高文件讀取的性能,當(dāng)應(yīng)用程序需在用到內(nèi)存的時候,buffer/cached會很快地被回收。 所以從應(yīng)用程序的角度來說,可用內(nèi)存=系統(tǒng)free memory+buffers+cached。 如上例:
185656=8908+21280+155468
接下來解釋什么時候內(nèi)存會被交換,以及按什么方交換。 當(dāng)可用內(nèi)存少于額定值的時候,就會開會進行交換。 如何看額定值(RHEL4.0):
#cat /proc/meminfo 交換將通過三個途徑來減少系統(tǒng)中使用的物理頁面的個數(shù):
1.減少緩沖與頁面cache的大小,
2.將系統(tǒng)V類型的內(nèi)存頁面交換出去,
3.換出或者丟棄頁面。(Application 占用的內(nèi)存頁,也就是物理內(nèi)存不足)。 事實上,少量地使用swap是不會影響到系統(tǒng)性能的。 下面是buffers與cached的區(qū)別。 buffers是指用來給塊設(shè)備做的緩沖大小,他只記錄文件系統(tǒng)的metadata以及 tracking in-flight pages. cached是用來給文件做緩沖。
那就是說:buffers是用來存儲,目錄里面有什么內(nèi)容,權(quán)限等等。而cached直接用來記憶我們打開的文件,如果你想知道他是不是真的生效,你可以試一下,先后執(zhí)行兩次命令#man X ,你就可以明顯的感覺到第二次的開打的速度快很多。 實驗:在一臺沒有什么應(yīng)用的機器上做會看得比較明顯。記得實驗只能做一次,如果想多做請換一個文件名。
#free
#man X
#free
#man X
#free 你可以先后比較一下free后顯示buffers的大小。 另一個實驗:
#free
#ls /dev
#free 你比較一下兩個的大小,當(dāng)然這個buffers隨時都在增加,但你有l(wèi)s過的話,增加的速度會變得快,這個就是buffers/chached的區(qū)別。 實例三:
linux 優(yōu)先使用物理內(nèi)存,當(dāng)物理內(nèi)存還有空閑時,linux是不會施放內(nèi)存的,即時占用內(nèi)存的程序已經(jīng)被關(guān)閉了(這部分內(nèi)存就用來做緩存了)。也就是說,即時你有2G的內(nèi)存,用過一段時間后,也會被占滿。這樣做的好處是,啟動那些剛開啟過的程序、或是讀取剛存取過得數(shù)據(jù)會比較快,對于服務(wù)器很有好處。 你可以用 free 指令查看一下輸出,用 used 減去 buffer 和 cache,才是你運行中的程序所占用的空間,這是我的輸出:
total???? used????? free??? shared?? buffers??? cached
Mem:?? 516300?? 504264? 12036???? 0?????? 88396??? 236792
-/+ buffers/cache: 179076 337224
Swap: 1544184 21276 1522908 504264 - 88396 - 236792 = 179076
也就是說目前正在被使用的內(nèi)存只有 179 兆。不要被 504兆的used嚇住了。 windows則總是給內(nèi)存留下一定的空閑空間,即時內(nèi)存有空閑也會讓程序使用一些虛擬內(nèi)存,這樣做的好處是,啟動新的程序比較快,直接分給它些空閑內(nèi)存就可以了,而linux下呢?由于內(nèi)存經(jīng)常處于全部被使用的狀態(tài),則要先清理出一塊內(nèi)存,再分配給新的程序使用,因此,新程序的啟動會慢一些。 另外,內(nèi)存是隨機訪問的,也就是說,無論你的內(nèi)存占用了多少,數(shù)據(jù)的存取時間都是相同的,跟硬盤不同
轉(zhuǎn)載于:https://blog.51cto.com/johnny86/159682
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Linux内存管理机制研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JPA EntityManager详解
- 下一篇: Linux经典实用的使用技巧33则和常用