memcache使用了slab allocator的記憶體分配機制:按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以
完全解決記憶體碎片問題
memcache的儲存涉及到slab,page,chunk三個概念
1.chunk為固定大小的記憶體空間,預設為96byte。
2.page對應實際的物理空間,1個page為1m。
3.同樣大小的chunk又稱為slab。
memcached再啟動的時候根據-n和-f引數,產生若干slab。具體應用中memcache每次申請1page,並將這1m空間分割成若干個chunk,這些chunk有著同樣的大小,屬於同乙個slab。
【新增】,通過memcache新增item的時候:
1. memcache計算item的大小(key+value+flags),選取合適的slab(剛好能放下該item的slab)
2. 如果這個item對應的slab未出現過,則申請1個page(注意,這1m空間不論是否達到memcached使用記憶體都可以申請成功)並加該item存入slab中的chunk
3. 如果item對應的slab出現過,則在該slab中優先選擇expired(free_chunks)和delete(在1.2.2中delete的chunk存在著不能被重複利用的問題)的chunk進行儲存,其次將選擇未使用過的chunk(free_chunks_end)進行儲存。
4. 如果item對應的slab出現過,但是對應的slab已經儲存滿了,那麼會申請乙個新的page,這個page被分為對應大小的chunk,繼續儲存。
5. 如果item對應的slab出現過,但是對應的slab已經儲存滿了並且memcache也達到了最大記憶體使用。將使用lru演算法,清除item(可能將未過期的item清除)此時會有eviction++
【刪除】:
1. delete操作只是將該chunk置為刪除狀態,這樣在下次使用將優先利用這樣的chunk。
【flush】
1. flush操作相當於將所有的item失效的乙個動作。並不會改變memcache記憶體分配情況。
一些注意
1. memcache已經分配的記憶體不會再主動清理。
2. memcache分配給某個slab的記憶體頁不能再分配給其他slab。
3. flush_all不能重置memcache分配記憶體頁的格局,只是給所有的item置為過期。
4. memcache最大儲存的item(key+value)大小限制為1m,這由page大小1m限制
5.由於memcache的分布式是客戶端程式通過hash演算法得到的key取模來實現,不同的語言可能會採用不同的hash演算法,同樣的客戶端程式也有可能使用相異的方法,因此在多語言、多模組共用同一組memcached服務時,一定要注意在客戶端選擇相同的hash演算法
6.啟動memcached時可以通過-m引數禁止lru替換,在記憶體用盡時add和set會返回失敗
7.memcached啟動時指定的是資料儲存量,沒有包括本身占用的記憶體、以及為了儲存資料而設定的管理空間。因此它占用的記憶體量會多於啟動時指定的記憶體分配量,這點需要注意。
8.memcache儲存的時候對key的長度有限制,php和c的最大長度都是250
記憶體管理機制
記憶體管理 jvm將記憶體分成三大主要區域 堆,棧,方法區,用來儲存資料。堆 堆中主要儲存引用型別物件,給成員變數分配空間。棧 jvm在執行程式時,在棧中會為每乙個方法都提供儲存空間叫棧幀,用來儲存方法中的區域性變數。方法區 用來儲存jvm載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...
記憶體管理機制
記憶體管理是乙個作業系統必不可少 並且 非常重要的一環 linux 的成功 和它優秀的記憶體管理聯絡非常密切 因為乙個系統的高效性慾穩定性往往決定於它的記憶體管理機制 我項很多人吃過 dos 下 640k 的苦吧 前面我們介紹了 386 保護模式 從今天起我們將在此基礎上 分析 linux 的虛擬儲...
iOS 記憶體管理機制
學習要點 1.reference counting 引用計數機制 2.了解mrc apc和gc 3.autoreleasepool 執行機制 4.如何避免 retain cycle reference counting 引用計數機制 cocoa 上基本的記憶體管理機制就是引用計數,通過乙個 refe...