内存对齐意味将数据类型写入到内存地址时是按照它们大小切割的,内存对齐会带来性能提升,是Java性能提升的黑技术。内存对齐定义(n是2的乘幂):

boolean nAligned = (address%n) == 0;

如果内存地址是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