天天看點

Java直接記憶體對齊(Memory Alignment)Java中使用記憶體對齊方法:

記憶體對齊

意味将資料類型寫入到記憶體位址時是按照它們大小切割的,記憶體對齊會帶來性能提升,是Java性能提升的黑技術。記憶體對齊定義(n是2的乘幂):

如果記憶體位址是n位元組的倍數,那麼我們說這n位元組是記憶體對齊的,注意,這裡n是2的幂,說白了,記憶體位址正好放下n位元組的倍數,兩者相除餘數為零,正好整除。

記憶體對齊類型有:

  1. 類型對齊:某種CPU需要其特定的對齊方式
  2. 緩存行對齊:正常是64,也有32/128,緩存行是主記憶體等記憶體的基本原子機關,有僞共享,字撕裂,原子性 等,跨緩存行性能差
  3. 記憶體頁大小對齊:網絡或磁盤操作時考慮

Java中使用記憶體對齊方法:

使用

Direct

/

MappedByteBuffer

/

Unsafe

等JDK工具類,Unsafe類基礎核心,是官方或半官方通路記憶體的關鍵。

記憶體對齊方式:

  1. 類型對齊:某種CPU需要其特定的對齊方式
  2. 緩存行對齊:正常是64,也有32/128,緩存行是主記憶體等記憶體的基本原子機關,有僞共享,字撕裂,原子性 等,跨緩存行性能差,這是我們關注的。
  3. 記憶體頁大小對齊:網絡或磁盤操作時考慮

是否使用記憶體對齊對于性能是有影響的,下載下傳這個gtihub可以對本機進行對齊與非對齊的性能測試。

基于記憶體對齊可以實作off heap以外的記憶體共享,如果将一個隊列放入這個共享記憶體,就能實作Java的IPC通訊,每秒可以發送135M消息,實作無鎖高并發。見:

135 Million messages a second between processes in pure Java