linux
記憶體管理機制研究
檢視linux系統中處於free狀態的記憶體有兩個角度,乙個是從核心的角度來看,乙個是從應用層的角度來看的。
1.從核心的角度來看free的記憶體,就是核心目前可以直接分配到,不需要額外的操作,這個free值是不包括系統中處於buffer和cache狀態的記憶體;但是在核心需要時,或在系統執行逐步推進時,buffer和cache狀態的記憶體可以變為free狀態的記憶體。
2.從應用層的角度來看系統處於free狀態的記憶體,這個值是包括處於buffer和cache的,所以應用層分配記憶體時,可以直接從buffer和cache中拿。
linux
系統之所以提高這種機制,是因為把記憶體都置為free狀態,還不如把最近使用過的記憶體快取起來(如從磁碟中讀取的資料),這樣再次需要這些資料時可以直接從記憶體中取,而不需要有乙個漫長的磁碟操作,這樣可以提高系統的整體效能。因為free狀態的記憶體中的內容是不可用的,與其閒置還不如發揮它們的作用。而在系統需要時,又可以快速的從這些可釋放的記憶體中分配,我想這種機制是非常好的。
下面我們來看看free命令的結果:
total used free shared buffers cached
mem: 500 355 145 0 67 249
-/+ buffers/cache: 38 462
swap: 996 1 994
在這個結果中的第一行是從核心角度來看系統記憶體使用狀態的,可以看到free的記憶體只有145m;
第二行是從應用層的角度來看系統記憶體的使用狀況,可以看到free的記憶體有462m;
你有沒有看到462這個值的妙處呢????462 :=145 +249 +67
例項二:
在linux下檢視記憶體我們一般用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
;下面是對這些數值的解釋:
total:
總計物理記憶體的大小。
used:
已使用多大。
free:
可用有多少。
shared:
多個程序共享的記憶體總額。
buffers/cached:
磁碟快取的大小。
第三行(-/+ buffers/cached):
used:
已使用多大。
free:
可用有多少。
第四行就不多解釋了。
第三行所指的是從應用程式角度來看,對於應用程式來說,buffers/cached 是等於可用的,因為buffer/cached是為了提高檔案讀取的效能,當應用程式需在用到記憶體的時候,buffer/cached會很快地被**。
所以從應用程式的角度來說,可用記憶體=系統free memory+buffers+cached。
如上例:
185656=8908+21280+155468
接下來解釋什麼時候記憶體會被交換,以及按什麼方交換。 當可用記憶體少於額定值的時候,就會開會進行交換。
如何看額定值(rhel4.0):
#cat /proc/meminfo
交換將通過三個途徑來減少系統中使用的物理頁面的個數:
1.減少緩衝與頁面cache的大小,
2.將系統v型別的記憶體頁面交換出去,
3.事實上,少量地使用swap是不會影響到系統效能的。
下面是buffers與cached的區別。
buffers
是指用來給塊裝置做的緩衝大小,他只記錄檔案系統的metadata以及tracking in-flight pages. cached是用來給檔案做緩衝。
那就是說:buffers是用來儲存,目錄裡面有什麼內容,許可權等等。而cached直接用來記憶我們開啟的檔案,如果你想知道他是不是真的生效,你可以試一下,先後執行兩次命令#man x ,你就可以明顯的感覺到第二次的開打的速度快很多。
實驗:在一台沒有什麼應用的機器上做會看得比較明顯。記得實驗只能做一次,如果想多做請換乙個檔名。
#free
#man x
#free
#man x
#free
你可以先後比較一下free後顯示buffers的大小。
另乙個實驗:
#free
#ls /dev
#free
你比較一下兩個的大小,當然這個buffers隨時都在增加,但你有ls過的話,增加的速度會變得快,這個就是buffers/chached的區別。
例項三:
linux
優先使用物理記憶體,當物理記憶體還有空閒時,linux是不會施放記憶體的,即時占用記憶體的程式已經被關閉了(這部分記憶體就用來做快取了)。也就是說,即時你有2g的記憶體,用過一段時間後,也會被佔滿。這樣做的好處是,啟動那些剛開啟過的程式、或是讀取剛訪問過得資料會比較快,對於伺服器很有好處。
你可以用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
也就是說目前正在被使用的記憶體只有179 兆。不要被504兆的used嚇住了。
windows
則總是給記憶體留下一定的空閒空間,即時記憶體有空閒也會讓程式使用一些虛擬記憶體,這樣做的好處是,啟動新的程式比較快,直接分給它些空閒記憶體就可以了,而linux下呢?由於記憶體經常處於全部被使用的狀態,則要先清理出一塊記憶體,再分配給新的程式使用,因此,新程式的啟動會慢一些。
Linux記憶體管理機制
經常遇到一些剛接觸linux 的新手會問記憶體占用怎麼那麼多?在linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是linux記憶體管理的乙個優秀特性,在這方 面,區別於windows的記憶體管理。主要特點是,無論物理記憶體有多大,linux ...
linux記憶體管理機制
linux系統的 物理記憶體就是實際記憶體 虛擬記憶體是為了避免物理記憶體不足而產生的概念,其是磁碟空間虛擬出來的一塊邏輯記憶體,即交換空間 swap space 將不經常使用的資料放在虛擬空間,這樣物理空間有足夠的空閒空間放經常使用的資料。交換空間的大小一般是物理記憶體的幾倍。使用命令free m...
記憶體管理機制
記憶體管理 jvm將記憶體分成三大主要區域 堆,棧,方法區,用來儲存資料。堆 堆中主要儲存引用型別物件,給成員變數分配空間。棧 jvm在執行程式時,在棧中會為每乙個方法都提供儲存空間叫棧幀,用來儲存方法中的區域性變數。方法區 用來儲存jvm載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...