持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
平时开发中很少会有人去想:一个Java对象占用多大内存,今天就来探究一下到底我们平时创建的对象占用了多大的内存。在Java中对象分为两种:基本类型、引用类型。我们从这两种类型入手来分析。
Tips: JDK版本为17
1. 基本类型
Java中有8种基本类型,占用的内存空间如下:
类型 | 占用空间(byte) |
---|---|
boolean | 1 |
byte | 1 |
short | 2 |
char | 2 |
int | 4 |
float | 4 |
long | 8 |
double | 8 |
Java中的基本类型数据是在栈上面分配还是栈上面?
回答上面一个问题之前首先要明确这个变量定义在哪?平时定义基本变量有三种情况:
- 定义类的静态变量
- 定义类的成员变量
- 定义方法体内变量
上面三种情况分配在不同的位置:
变量位置 | 分配位置 |
---|---|
定义类的静态变量 | 堆上分配 |
定义类的成员变量 | 堆上分配 |
定义方法体内变量 | 栈上分配 |
Tips: jdk17 字符串常量池和静态变量仍然在堆当中;运行时常量池、类型信息、常量、字段、方法被移动都了元空间中
2. 引用类型
下面来分析一下引用类型对象的大小。
2.1 Java对象模型
Java对象模型分为三个部分:对象头、对象实际数据、对齐填充区
对象头中又包含了很多,这个后续文章分析。
对象头又包含了三部分:MarkWord、对象元数据指针、数组对象长度:
- MarkWord:用于存储对象运行时的数据,好比 HashCode、锁状态标志、GC分代年龄等。这部分在 64 位操作系统下占 8 字节,32 位操作系统下占 4 字节。
- 对象元数据指针:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪一个类的实例。这部分就涉及到指针压缩的概念,在开启指针压缩的状况下占 4 字节,未开启状况下占 8 字节。
- 数组长度:这部分只有是数组对象才有,若是是非数组对象就没这部分。这部分占 4 字节。所以Java中对象的最大值就是int类型的最大值
对象实际数据就是存储对象各个字段中的信息
对齐填充:Java 对象的大小默认是按照 8 字节对齐,也就是说 Java 对象的大小必须是 8 字节的倍数。若是算到最后不够 8 字节的话,那么就会进行对齐填充。
我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢!