内存对齐对Java应用性能的影响(Memory Alignment)

内存对齐可以有效提升CPU处理速度,尤其,在有锁争用的场景,内存对齐对Java性能也有深远的影响。

内存对齐对CPU的影响

内存对齐的定义为2的倍数,常为32、64、128字节,当然这只是一个粗糙的说法。如果明白了没有对齐的内存对CPU的影响,自然就清楚了它是如何提升效率的。

简单的理解为CPU高速缓存行,从内存中一次取出32字节、64字节、128字节(正常是64,32/128也有),如果一个变量,刚好占这么多的内存那是最理想的,如果不能则会导致一个缓存行上,存放多个变量,由于CPU锁定的最小单元是按行锁定,当多个线程同时读写,同一个缓存行上的不同变量的时,会导致这些线程之间互斥,从而对性能产生影响。,

如果把一个变量,所没有用完的缓存行,用空白数据填满,就不会出现不同变量间互斥问题,内存对齐就是一想法的具体实现。内存对齐对网络或磁盘操作都有一定的影响。

Java中内存对齐的实现

JDK工具类中的Direct/MappedByteBuffer/Unsafe类都是这些思想的体现。

基于内存对齐的队列,每秒可以发送135M(135 Million)消息[135 Million messages a second between processes in pure Java],基本实现了无锁高并发。如果对这项“黑科技”有兴趣,可以从github下载相关测试工具。

https://github.com/nitsanw/psy-lob-saw

如果对这类话题有更多的了解,可以阅读下面这篇文章。

https://psy-lob-saw.blogspot.com/2013/04/lock-free-ipc-queue.html