前言

本文中的储存分析以64位机器上的java为标准,其他主流语言也基本相通。
在分析储存空间大小前我们需要掌握基本知识:

  • bit:位,是表示信息的最小单位,取值为0或1
  • byte:字节,一个byte等于8个bit
  • 64位机器:在计算机架构中,64位整数、内存地址或其他数据单元,是指它们最高达到64位(8字节)宽

基本类型

类型 占用字节
boolean 1
byte 1
char 2
int 4
float 4
long 8
数组类型 占用字节
char[] 2N+24
int[] 4N+24
double[] 8N+24

类(class)的内存占用分析

  • 对象头Object overhead:占用16个字节
  • 引用Reference :占用8个字节
  • 填充部分Padding :每个类的其他组成部分要占用8个字节
    Padding可能不太好理解,我们以下面这个Date类为例进行分析讲解:
    [普林斯顿大学教程]只需十分钟教你如何分析储存空间占用大小——int、double、char占多少字节?如何分析一个类class占用的储存空间?
    我们看到对象头占用了16个字节,day、month、year各自占用了4个字节,但是问题来了,我只能8个字节8个字节的占用,day和month可以正好占用8个字节,year就需要和padding填充块共同占用8个字节。因此,总的空间占用位32个字节。

我们再来看看第二个例子:
对于一个String类,需要有一个char类型的数组储存值,占用2N+24个字节(参照上面的数组占用)
同时因为引用到了数组,需要加上8字节的空间。
offset、count、hash三个int类型的参数再加上为了凑到8字节的整数倍而加上的4字节的padding填充部分,一共16字节
因此总共的空间占用位2N+64字节。
[普林斯顿大学教程]只需十分钟教你如何分析储存空间占用大小——int、double、char占多少字节?如何分析一个类class占用的储存空间?

相关文章:

  • 2021-06-04
  • 2022-12-23
  • 2021-12-20
  • 2021-11-17
  • 2021-07-22
  • 2022-12-23
  • 2022-12-23
  • 2021-08-10
猜你喜欢
  • 2022-01-29
  • 2022-12-23
  • 2021-06-18
  • 2022-12-23
  • 2021-11-29
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案