Linux記憶體管理機制研究

2021-04-27 09:42:50 字數 3196 閱讀 4150

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載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...