Ptmalloc2筆記-1
學習Glibc 記憶體管理 Ptmalloc2 原始碼分析.pdf
基礎
heap
,作業系統提供brk()
函式,C
執行時庫提供sbrk()
函式
mmap
對映區域,作業系統提供mmap()
和munmap()
函式.
這些函式都可以用來向程序新增額外的虛擬記憶體.Glibc
同樣使用這些函式向作業系統申請虛擬記憶體
核心資料結構mm_struct
的成員start_code
和end_code
是程序程式碼段的起始終止地址,start_data
和end_data
是程序資料段的起始終止地址,start_stack
是程序堆疊段起始地址,start_brk
是程序動態記憶體分配起始地址,還有一個brk
#include <unistd.h>
int brk(void *addr);
void *sbrk(intptr_t increment);
brk()
改變mm_struct
結構的成員變數brk
的值
sbrk()
的引數為0
時,sbrk()
返回程序的當前brk
,為正數時擴充套件brk
值,為負值時收縮brk
值.
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
mmap()
函式將一個檔案或者其它物件對映進記憶體多個頁上,如果檔案大小不是所有頁的大小之和,最後一個頁不被使用的空間將會清零.
munmap
執行相反的操作,刪除特定地址區域的物件對映.
引數:
addr
:對映區的開始地址.
length
:對映區的長度.
prot
:期望的記憶體保護標誌,不能與檔案的開啟模式衝突.
PROT_EXEC
//頁內容可以被執行,ptmalloc
中沒有使用
PROT_READ
//頁內容可以被讀取,ptmalloc
直接用mmap
分配記憶體並立即返回給使用者時設定該標誌
PROT_WRITE
//頁可以被寫入,ptmalloc
mmap
分配記憶體並立即返回給使用者時設定該標誌
PROT_NONE
//頁不可訪問,ptmalloc
用mmap
向系統”批發”一塊記憶體進行管理時設定該標誌
flags
:指定對映物件的型別,對映選項和對映頁是否可以共享
MAP_FIXED
//使用指定的對映起始地址,如果由addr
和length
引數指定的記憶體區重疊於現存的對映空間,重疊部分將會被丟棄.如果指定的起始地址不可用,操作將會失敗.並且起始地址必須落在頁的邊界上.Ptmalloc
在回收從系統中”批發”的記憶體時設定該標誌.
MAP_PRIVATE
//建立一個寫入時拷貝的私有對映.記憶體區域的寫入不會影響到原檔案.這個標誌和以上標誌是互斥的,只能使用其中一個.Ptmalloc
每次呼叫mmap
都設定該標誌.
MAP_NORESERVE
//不要為這個對映保留交換空間.當交換空間被保留,對對映區修改的可能會得到保證.當交換空間不被保留,同時記憶體不足,對對映區的修改會引起段違例訊號.Ptmalloc
向系統”批發”記憶體塊時設定該標誌.
MAP_ANONYMOUS
//匿名對映,對映區不與任何檔案關聯.Ptmalloc
每次呼叫mmap
都設定該標誌.
fd
:有效的檔案描述詞.如果MAP_ANONYMOUS
被設定,為了相容問題,其值應為-1
.
offset
:被對映物件內容的起點
C
記憶體管理程式
較著名的幾個C
記憶體管理程式:
1. Doug Lea Malloc
:一組分配程式,包括Doug Lea
,GNU libc
的分配程式和ptmalloc
.Doug Lea
的分配程式加入了索引,並且可以將多個沒有被使用的塊組合為一個大的塊.還支援快取,以便更快地再次使用最近釋放的記憶體.ptmalloc
是Doug Lea Malloc
的一個擴充套件版本,支援多執行緒.
2. BSD Malloc
:BSD Malloc
是隨4.2 BSD
發行的實現,包含在FreeBSD
之中,可以從預先確實大小的物件構成的池中分配物件.它有一些用於物件大小的size
類,這些物件的大小為2
的若干次冪減去某一常數.所以,如果您請求給定大小的一個物件,它就簡單地分配一個與之匹配的size
類.這樣就提供了一個快速的實現,但是可能會浪費記憶體.
3. Hoard
:編寫Hoard
的目標是使記憶體分配在多執行緒環境中進行非常快.構造以鎖的使用為中心,從而使所有程序不必等待分配記憶體.可以顯著地加快那些進行很多分配和回收的多執行緒程序的速度.
4. TCMalloc
:(Thread-Caching Malloc
)google
的開源工具google-perftools
中的成員.TCMalloc
是一種通用記憶體管理程式,集成了記憶體池和垃圾回收的優點,對於小記憶體,按8
的整數次倍分配,對於大記憶體,按4K
的整數次倍分配.TCMalloc
還有一套高效的機制回收這些空閒的記憶體.當一個執行緒的空閒記憶體比較多的時候,會交還給程序,程序可以把它調配給其他執行緒使用;如果某種長度交還給程序後,其他執行緒並沒有需求,程序則把這些長度合併成記憶體頁,然後切割成其他長度.如果程序佔據的資源比較多呢,據說不會交回作業系統.週期性的記憶體回收,避免可能出現的記憶體爆炸式增長的問題.TCMalloc
有比較高的空間利用率,只額外花費1%
的空間.儘量避免加鎖(一次加鎖解鎖約浪費100ns
),使用更高效的spinlock
,採用更合理的粒度.小塊記憶體和大塊記憶體分配採取不同的策略:小於32K
的被定義為小塊記憶體,小塊記憶體按大小被分級.不是某個級別整數倍的大小都會被分配向上取整.分配時,首先在本執行緒相應大小級別的空閒連結串列裡面找,如果找到的話可以避免加鎖操作.如果找不到的話,則嘗試從中心記憶體區的相應級別的空閒連結串列裡搬一些物件到本執行緒的連結串列.如果中心記憶體區相應連結串列也為空的話,則向中心頁分配器請求記憶體頁面,然後分割成該級別的物件儲存.大塊記憶體處理方式:按頁分配,每頁大小是4K
,然後記憶體大小分類,相同大小的記憶體塊也用連結串列連線
Ptmalloc
記憶體管理概述
Main_arena
與non_main_arena
主分配區與非主分配區用環形連結串列進行管理.每一個分配區利用互斥鎖(mutex
)使執行緒對於該分配區的訪問互斥.
每個程序只有一個主分配區,但可能存在多個非主分配區,分配區的數量一旦增加,就不會再減少了
主分配區可以訪問程序heap
區域和mmap
對映區域,可以使用sbrk
和mmap
向作業系統申請虛擬記憶體.而非主分配區只能訪問程序的mmap
對映區域,非主分配區使用mmap()
向作業系統”批發”HEAP_MAX_SIZE
(32位系統上預設為1MB
,64位系統預設為64MB
)大小的虛擬記憶體,使用者向非主分配區請求分配記憶體時再切割成小塊.主分配區可以訪問heap
區域,如果使用者不呼叫brk()
或是sbrk()
函式,分配程式就可以保證分配到連續的虛擬地址空間.
當某一執行緒呼叫malloc()
分配記憶體空間時,執行緒先檢視執行緒私有變數中是否存在一個分配區,存在則嘗試對分配區加鎖,如果加鎖成功,分配記憶體;如果失敗,執行緒搜尋迴圈連結串列試圖獲得一個沒加鎖的分配區.如果所有的分配區都已經加鎖,那麼malloc()
會開闢一個新分配區,把該分配區加入到全域性分配區迴圈連結串列並加鎖,然後使用該分配區進行分配記憶體操作.在釋放操作中,執行緒同樣試圖獲得待釋放記憶體塊所在分配區的鎖,如果該分配區正在被別的執行緒使用,則需要等待直到其他執行緒釋放該分配區的互斥鎖之後才可以進行釋放操作
chunk
使用者請求分配的空間在ptmalloc
中都使用一個chunk
來表示
使用中的chunk
,chunk
指標指向開始,mem
指標才是真正返回給使用者的記憶體指標.
chunk
的第二個域的最低一位為P
,表示前一個塊是否在使用中,P
為0
表示前一chunk空閒,這時chunk
的第一個域prev_size
才有效,prev_size
表示前一chunk
的size
,程式可以使用這個值來找到前一chunk
的開始地址.P
為1
,表示前一個chunk
正在使用,prev_size
無效.ptmalloc
分配的第一個塊總是將P
設為1
.
chunk
的第二個域的倒數第二個位為M
,表示當前chunk
是從哪個記憶體區域獲得的虛擬記憶體.M
為1
表示是從mmap
對映區域分配的,否則是從heap
區域分配的.
chunk
的第二個域倒數第三個位為A
,表示該chunk
屬於主分配區或者非主分配區,如果屬於非主分配區,將該位置為1
,否則置為0
.
空閒的chunk
,當chunk
空閒時,其M
狀態不存在,只有AP
狀態.
指標fd
指向所在bins
後一空閒chunk
,bk
指向所在bins
前一空閒chunk
,ptmalloc
通過這兩個指標將大小相近的chunk
連成一個雙向連結串列(bins
).
對於large bin
中的空閒chunk
,還有兩個指標,fd_nextsize
和bk_nextsize
,這兩個指標用於加快在large bin
中查詢最近匹配的空閒chunk
.
空間複用
一個chunk
正在被使用或者已經被free
,所以chunk
的中的一些域可以在使用狀態和空閒狀態表示不同的意義,來達到空間複用的效果.
以32位系統為例,空閒時,一個chunk
中至少需要4個size_t(4B)
的空間,用來儲存prev_size
,size
,fd
和bk
,chunk
的大小要對齊到8B
.一個chunk
處於使用狀態時,下一個chunk
的prev_size
域是無效的.這個空間可以被當前chunk
使用.故而實際上,一個使用中的chunk
的大小的計算公式應該是:in_use_size = (使用者請求大小+ 8 - 4 ) align to 8B
.最後,因為空閒的chunk
和使用中的chunk
使用的是同一塊空間.所以肯定要取其中最大者作為實際的分配空間.即最終的分配空間chunk_size = max(in_use_size, 16)
空閒chunk
容器
Bins
free
的記憶體並不都會馬上歸還系統,ptmalloc
會統一管理heap
和mmap
對映區域中的空閒chunk
,當下一次分配請求時,ptmalloc
會試圖在空閒chunk
中挑選一塊給使用者.ptmalloc
將相似大小的chunk
用雙向連結串列連結起來,被稱為一個bin
.ptmalloc
共維護了128
個bin
,並使用一個數組來儲存這些bin
.
陣列中的第一個為unsorted bin
.
陣列中從2
開始的前64
個bin
稱為small bins
,同一個small bin
中的chunk
具有相同的大小.相鄰的small bin
大小相差8bytes
.small bins
中的chunk
按照最近使用順序進行排列,最後釋放的chunk
被連結到連結串列的頭部,而申請chunk
是從連結串列尾部開始.
small bins
後面的為large bins
.每個large bin
包含了給定範圍內大小的chunk
,其中的chunk
按大小序排列.相同大小的chunk
同樣按照最近使用順序排列.ptmalloc
使用smallest-first,best-fit
原則在空閒large bins
中查詢合適的chunk
.
空閒的chunk
被連結到bin
中的時候,ptmalloc
把表示該chunk
是否處於使用中的標誌P
設為0
(注意,這個標誌實際上處在下一chunk
中),同時ptmalloc
會檢查它前後的chunk
是否也空閒,如果是,ptmalloc
會把它們合併為一個chunk
,然後將合併後的chunk
放到unstored bin
中.並不是所有的chunk
被釋放後就立即被放到bin
中.一些小的chunk
會放到fast bins
內.
Fast Bins
ptmalloc
在分配過程引入fast bins
,不大於max_fast
(預設值為64B
)的chunk
被釋放後,會放到fast bins
,fast bins
中的chunk
並不改變它的使用標誌P
.這樣也就無法將它們合併,當需要分配的chunk
不大於max_fast
時,ptmalloc
首先會在fast bins
中查詢相應的空閒塊,然後才會去查詢bins
中的空閒chunk
.在某個特定的時候,ptmalloc
會遍歷fast bins
中的chunk
,將相鄰的空閒chunk
進行合併,並將合併後的chunk
加入unsorted bin
中,然後再將unsorted bin
裡的chunk
加入bins
.
Unsorted Bin
unsorted bin
的佇列使用bins
陣列的第一個,如果釋放的chunk
大於max_fast
,或者fast bins
中空閒chunk
合併後,這些chunk
首先會被放到unsorted bin
中,進行malloc
操作的時候,如果在fast bins
中沒有找到合適的chunk
,則ptmalloc
會先在unsorted bin
中查詢合適的空閒chunk
,然後查詢bins
.如果unsorted bin
不能滿足分配要求.malloc
便會將unsorted bin
中的chunk
加入bins
中.然後再從bins
中繼續進行查詢和分配過程.unsorted bin
可以看做是bins
的一個緩衝區.
特殊chunk
有三種特殊chunk
.top chunk
,mmaped chunk
和last remainder
Top chunk
對於非主分配區會預先從mmap
區域分配一塊較大的空閒記憶體模擬sub-heap
,通過管理sub-heap
來響應使用者的需求,在空閒記憶體的最高處,必然存在著一塊空閒chunk
,top chunk
.
當bins
和fast bins
都不能滿足分配需要,ptmalloc
會在top chunk
中分出一塊記憶體,如果top chunk
本身不夠大,分配程式會重新分配一個sub-heap
,並將top chunk
遷移到新的sub-heap
上,新的sub-heap
與已有的sub-heap
用單向連結串列連線起來,然後在新的top chunk
上分配所需的記憶體以滿足分配的需要.
top chunk
的大小是隨著分配和回收不停變換的,如果從top chunk
分配記憶體會導致top chunk
減小,如果回收的chunk
恰好與top chunk
相鄰,這兩個chunk
就會合併成新的top chunk
,從而top chunk
變大.如果free
時回收記憶體大於某個閾值,並且top chunk
大小也超過收縮閾值,ptmalloc
會收縮sub-heap
,如果top-chunk
包含整個sub-heap
,ptmalloc
呼叫munmap
把sub-heap
的記憶體返回作業系統.
主分配區是唯一能對映程序heap
的分配區,可以通過sbrk()
來增大或是收縮排程heap
的大小,ptmalloc
在開始會預先分配一塊較大的空閒記憶體(也就是所謂的heap
),主分配區的top chunk
在第一次malloc
時會分配一塊(chunk_size + 128KB) align 4KB
大小的空間作為初始的heap
,使用者從top chunk
分配記憶體時,可以直接取出記憶體給使用者.回收記憶體時,回收的記憶體恰好與top chunk
相鄰則合併成新top chunk
,當該次回收的空閒記憶體大小達到某個閾值,並且top chunk
的大小也超過了收縮閾值,會執行記憶體收縮,減小top chunk
的大小,但至少保留一個頁大小,從而把記憶體歸還作業系統.向主分配區的top chunk
申請記憶體,而top chunk
沒有空閒記憶體,ptmalloc
會呼叫sbrk()
將程序heap
邊界brk
上移,然後修改top chunk
的大小.
mmaped chunk
top chunk
不能滿足分配需求時,ptmalloc
會使用mmap
來直接使用記憶體對映來將頁對映到程序空間.這樣分配的chunk
在被free
時將直接解除對映,於是就將記憶體歸還給了作業系統,再次對這樣的記憶體區的引用將導致segmentation fault
錯誤.
Last remainder
last remainder
是另外一種特殊的chunk
,不在任何bins
中.當需要分配small chunk
,但small bins
找不到合適的chunk
,如果last remainder chunk
大於所需small chunk
大小,last remainder chunk
被分裂成兩個chunk
,其中一個chunk
返回給使用者,另一個chunk
變成新的last remainder chuk
.
sbrk與mmap
.bss
段之上的分配給使用者程式的空間被稱為heap
.在malloc
之前,brk
等於start_brk
.ptmalloc
在開始時,若請求的空間小於mmap
分配閾值(mmap threshold
,預設值為128KB
),主分配區會呼叫sbrk()
增加一塊大小為 (128 KB + chunk_size) align 4KB
的空間作為heap
.非主分配區會呼叫mmap
對映一塊大小為HEAP_MAX_SIZE
(32位系統上預設為1MB
,64位系統上預設為64MB
)的空間作為sub-heap
.
這就是ptmalloc
維護的分配空間.若需要分配的chunk
小於mmap
分配閾值,而heap
又不夠,則此時主分配區會通過sbrk()
呼叫來增加heap
大小,非主分配區會呼叫mmap
對映一塊新的sub-heap
,也就是增加top chunk
的大小,每次heap
增加的值都會對齊到4KB
.
使用者的請求超過mmap
分配閾值,並且主分配區使用sbrk()
分配失敗或是非主分配區在top chunk
中不能分配到需要的記憶體時,ptmalloc
會嘗試使用mmap()
直接對映一塊記憶體到程序記憶體空間.
ptmalloc
munmap chunk
回收的chunk
大於mmap
分配閾值,小於DEFAULT_MMAP_THRESHOLD_MAX
(32位系統預設為512KB
,64位系統預設為32MB
),ptmalloc
會把mmap
分配閾值調整為當前回收的chunk
的大小,並將mmap
收縮閾值(mmap trim threshold
)設定為mmap
分配閾值2
倍.這就是ptmalloc
對mmap
分配閾值的動態調整機制,該機制預設開啟,可以用mallopt()
關閉該機制
記憶體分配概述
- 分配演算法概述,以
32
系統為例.- 小於等於
64
位元組:用pool
演算法分配. 64
到512
位元組之間:在最佳匹配演算法分配和pool
演算法分配中取一種合適的.- 大於等於
512
位元組:用最佳匹配演算法分配. - 大於等於
mmap
分配閾值(預設值128KB
):根據mmap
分配策略分配,如果沒開啟mmap
分配閾值的動態調整機制,大於等於128KB
就直接呼叫mmap
分配.否則,大於等於mmap
分配閾值時才直接呼叫mmap()
分配.
- 小於等於
ptmalloc
的響應使用者記憶體分配要求的具體步驟為:- 獲取分配區的鎖,為了防止多個執行緒同時訪問同一個分配區,在進行分配之前需要取得分配區域的鎖.執行緒先檢視執行緒私有例項中是否已經存在一個分配區,如果存在嘗試對該分配區加鎖,如果加鎖成功,使用該分配區分配記憶體,否則,該執行緒搜尋分配區迴圈連結串列試圖獲得空閒(沒有加鎖)的分配區.如果所有的分配區都已經加鎖,那麼
ptmalloc
會開闢一個新的分配區,把該分配區加入到全域性分配區迴圈連結串列和執行緒的私有例項中並加鎖,然後使用該分配區進行分配操作.開闢出來的新分配區一定為非主分配區,因為主分配區是從父程序那裡繼承來的.開闢非主分配區時會呼叫mmap()
建立一個sub-heap
,並設定好top chunk
. - 將使用者的請求大小轉換為實際需要分配的
chunk
空間大小. - 判斷
chunk_size <= max_fast (max_fast 預設為 64B)
,如果是,嘗試在fast bins
中取一個所需大小的chunk
分配給使用者.如果不是或者找不到,下一步 - 判斷
chunk_size < 512B
.如果是,根據所需分配的chunk
的大小,找到具體所在的small bin
,從該bin
的尾部摘取一個恰好滿足大小的chunk
,如果不是或者找不到,下一步 ptmalloc
首先會遍歷fast bins
中的chunk
,將相鄰的chunk
進行合併,並連結到unsorted bin
中,然後遍歷unsorted bin
中的chunk
,如果unsorted bin
只有一個chunk
,並且這個chunk
在上次分配時被使用過,並且所需分配的chunk
大小屬於small bins
,並且chunk
的大小大於等於需要分配的大小,這種情況下就直接將該chunk
進行切割,分配結束,否則將根據chunk
的空間大小將其放入small bins
或是large bins中
,遍歷完成後,下一步fast bins
和unsorted bin
中所有chunk
都清除了.從large bins
中按照smallest-first,best-fit
原則,找一個合適的chunk
,從中劃分一塊所需大小的chunk
,並將剩下的部分連結回到bins
中.若操作成功,則分配結束,否則下一步.- 操作
top chunk
來進行分配.如果判斷top chunk
大小滿足所需chunk
的大小則從top chunk
中分出一塊來.否則下一步。 - 如果是主分配區,呼叫
sbrk()
,增加top chunk
大小;如果是非主分配區,呼叫mmap
來分配一個新的sub-heap
,增加top chunk
大小;或者使用mmap()
來直接分配.在這裡,需要依靠chunk
的大小來決定使用哪種方法.判斷所需分配的chunk
大小是否大於等於mmap
分配閾值,如果是的話,使用mmap
系統呼叫為程式的記憶體空間對映一塊chunk_size align 4kB
大小的空間.(第一次呼叫malloc
,若是主分配區,則需要進行一次初始化工作,分配一塊大小為(chunk_size + 128KB) align 4KB
大小的空間作為初始的heap
) Tips
:第一次分配記憶體時,一般情況下只存在一個主分配區,也可能從父程序那裡繼承來了多個非主分配區.
- 獲取分配區的鎖,為了防止多個執行緒同時訪問同一個分配區,在進行分配之前需要取得分配區域的鎖.執行緒先檢視執行緒私有例項中是否已經存在一個分配區,如果存在嘗試對該分配區加鎖,如果加鎖成功,使用該分配區分配記憶體,否則,該執行緒搜尋分配區迴圈連結串列試圖獲得空閒(沒有加鎖)的分配區.如果所有的分配區都已經加鎖,那麼
記憶體回收概述
free()
函式的工作步驟:
1. free()
函式首先需要獲取分配區的鎖
2. 判斷傳入的指標是否為0
,不為0
下一步.
3. 判斷所需釋放的chunk
是否為mmaped chunk
,如果是,則呼叫munmap()
釋放mmaped chunk
,解除記憶體空間對映.如果開啟了mmap
分配閾值的動態調整機制,並且當前回收的chunk
大於mmap
分配閾值,將mmap
分配閾值設定為該chunk
大小,將mmap
收縮閾值設定為mmap
分配閾值的2
倍,釋放完成.否則下一步
4. 判斷chunk
大小和所處位置,若chunk_size <= max_fast
,並且chunk
不與top chunk
相鄰,則將chunk放到fast bins
中,不修改該chunk
使用狀態位P
.釋放結束.否則下一步
5. 判斷前一個chunk
是否處在使用中,如果前一個塊也是空閒塊,則合併.並轉下一步.
6. 判斷當前釋放chunk
的下一個塊是否為top chunk
,如果是,則與top chunk
合併,並更新top chunk
的大小等資訊;如果不是,判斷下一chunk
是否處在使用,如果空閒則合併,並將合併後的chunk
放到unsorted bin
中.下一步
7. 無論是不是.判斷合併的chunk
大小是否大於FASTBIN_CONSOLIDATION_THRESHOLD
(預設64KB
),如果是,則觸發fast bins
的合併操作,fast bins
中的chunk
將被遍歷,並與相空閒chunk
合併,合併的chunk
會被放到unsorted bin
中.fast bins
為空.判斷top chunk
的大小是否大於mmap
收縮閾值(預設128KB
),如果是,對於主分配區,試圖歸還top chunk
的一部分給作業系統.但最先分配的128KB
空間不會歸還,ptmalloc
會一直管理這部分記憶體,用於響應使用者的分配請求;如果為非主分配區,會進行sub-heap
收縮,將top chunk
的一部分返回給作業系統,如果top chunk
為整個sub-heap
,會把整個sub-heap
還給作業系統.做完這一步之後,釋放結束.
配置選項概述
ptmalloc
主要提供以下幾個配置選項,通過mallopt()
設定
1. M_MXFAST
:用於設定fast bins
中儲存chunk
的最大大小,預設值為64B
.M_MXFAST
的最大值為80B
,如果設定該選項為0
,就會不使用fast bins
2. M_TRIM_THRESHOLD
:用於設定mmap
收縮閾值,預設值為128KB
.自動收縮只在free
時發生,在發生記憶體收縮時,會重新設定mmap
分配閾值和mmap
收縮閾值.(作業系統呼叫mmap()
分配記憶體是序列的,在發生缺頁異常時載入新的物理頁,需要對新的物理頁做清0
操作)M_TRIM_THRESHOLD
的值必須設定為頁大小對齊,設定為-1
會關閉記憶體收縮設定.
3. M_MMAP_THRESHOLD
:用於設定mmap
分配閾值,預設值為128KB
,ptmalloc預設開啟動態調整mmap
分配閾值和mmap
收縮閾值.
4. M_MMAP_MAX
:用於設定程序中用mmap
分配的記憶體塊的最大限制,預設值為64K
,如果將M_MMAP_MAX
設定為0
,ptmalloc
將不會使用mmap
分配大塊記憶體.
ptmalloc
為PER_THREAD
的優化提供兩個選項,M_ARENA_TEST
和M_ARENA_MAX
.
ptmalloc
沒有提供關閉mmap分配閾值動態調整機制的選項,mmap分配閾值動態調整預設開啟,如果要關閉mmap
分配閾值動態調整機制,可以設M_TRIM_THRESHOLD
,M_MMAP_THRESHOLD
,M_TOP_PAD
,M_MMAP_MAX
中的任意一個.