hotspot的記憶體對齊

2021-09-27 09:43:13 字數 994 閱讀 6223

上界對齊 #define align(x,a) (((x)+(a)-1)&~(a-1))

就是以a為上界對齊的意思。舉個例子4k頁面邊界的例子,即a=4096:如果x = 3888;那麼以上界對齊,執行結果就是4096。如果x = 4096;結果是4096.如果x = 4222; 則結果為8192. 

下界對齊 #define align(x,a) ((x)&~(a-1))

就是以a為下界界對齊的意思。若x = 3888; 結果為0.如果x = 4096;結果是4096.如果x = 4222; 則結果為4096.你可以把這兩種方式理解為「上進」和「丟棄」。

在hotspot中的/vm/utilities/globaldefinitions.cpp檔案中

提供的詳細演算法如下:

#define align_size_up_(size, alignment) (((size) + ((alignment) - 1)) & ~((alignment) - 1))

以alignment為上界進行對齊。  

在allocation.hpp檔案的開始部分定義了如下3個巨集變數: 

#define arena_align_m1 (((size_t)(arena_amalloc_alignment)) - 1)

#define arena_align_mask (~((size_t)arena_align_m1))

#define arena_align(x)  ((((size_t)(x)) + arena_align_m1) & arena_align_mask)

最終的arena_align如下:

#define arena_align(x) (

((size_t)(x) + ((size_t)8 - 1)) &   

(~((size_t) ((size_t)8 - 1)))    )

x以8為上界對齊的意思。

記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理

一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...

記憶體對齊(自然對齊)

參考 今天與超,暉,棟,宇幾人論此問題,終得以下結論,不知正確與否,姑且記下。對於32位機,cpu的記憶體讀寫週期是4word,所以在記憶體對齊時,皆以此填滿。如 struct a char a double b char c sizeof a 4 8 4 16 struct b char a do...

位元組對齊 記憶體對齊 對齊粒度

其實標題裡面的三個關鍵字說的都是同乙個東西。也就是c 中類和結構體在記憶體中的分配策略,專業術語可以稱之為 對齊模數 alignment modules 對齊模數分為三類 1.自身對齊模數,也就是類或結構體中成員的大小,1,2,4,8之中的乙個,對應byte word dword qword。2.指...