内存对齐
意味将数据类型写入到内存地址时是按照它们大小切割的,内存对齐会带来性能提升,是Java性能提升的黑技术。内存对齐定义(n是2的乘幂):
boolean nAligned = (address%n) == 0;
如果内存地址是n字节的倍数,那么我们说这n字节是内存对齐的,注意,这里n是2的幂,说白了,内存地址正好放下n字节的倍数,两者相除余数为零,正好整除。
内存对齐类型有:
- 类型对齐:某种CPU需要其特定的对齐方式
- 缓存行对齐:正常是64,也有32/128,缓存行是主内存等内存的基本原子单位,有伪共享,字撕裂,原子性 等,跨缓存行性能差
- 内存页大小对齐:网络或磁盘操作时考虑
Java中使用内存对齐方法:
使用Direct
/MappedByteBuffer
/Unsafe
等JDK工具类,Unsafe类基础核心,是官方或半官方访问内存的关键。
内存对齐方式:
- 类型对齐:某种CPU需要其特定的对齐方式
- 缓存行对齐:正常是64,也有32/128,缓存行是主内存等内存的基本原子单位,有伪共享,字撕裂,原子性 等,跨缓存行性能差,这是我们关注的。
- 内存页大小对齐:网络或磁盘操作时考虑
是否使用内存对齐对于性能是有影响的,下载这个gtihub可以对本机进行对齐与非对齐的性能测试。
基于内存对齐可以实现off heap以外的内存共享,如果将一个队列放入这个共享内存,就能实现Java的IPC通讯,每秒可以发送135M消息,实现无锁高并发。见:
135 Million messages a second between processes in pure Java