有趣的对齐填充:空间换时间

1,120 阅读1分钟

前言 大家都知道一个Java对象其实是由三部分组成的:对象头、对象体、以及今天的主人公:Padding对齐填充

image.png

一、什么是对齐填充?

在一个对象实例化的过程中,对齐填充本身并没有特殊的实际意义,目的仅仅是使得对象实例占用的空间是8字节的倍数。 如果一个对象实例后不是8字节的倍数,就会使用对齐填充来实现。

二、为什么要这样设计?

2.1 为什么是8字节?

CPU读取内存数据的时候,并不是按照一个字节一个字节来读取,而是以字长为单位进行数据的访问。

字长(Word Size):是指cpu一次能够并行处理的二进制位数,通常是8字节的整数倍。

image.png 因此对齐填充在每一次填充对象内存占用空间时都为8字节的倍数。

2.2 空间换时间?

例如:在一个64位的操作系统中,CPU访问内存读取数据的单位就是8字节。这样每次填充同样是8字节的倍数,在CPU访问内存数据时就可以减少访问次数,有效的提高CPU使用率

  • 未对齐的对象在内存的读取方式

image.png

其实像这样的填充虽然是无效的填充,但是这种空间换时间的思路却减少了cpu访问的次数,提高了cpu使用效率。