首先我们需要知道的是 Java 对象是包含三部分数据的:?
1. 对象头?
2. 实例数据?
3. 对齐填充 (可能没有, 因为 java 中规定对象的起始地址必须是 8 bytes 的正数倍)?
对于普通对象而言, 对象头中包括 mark Word(8 bytes),kclass(没有开启压缩的时候是 8 bytes, 开启压缩了的话, 就是 4 bytes), 如果是数组类型的对象话, 这里还有一个数组长度字段, 4 字节.?
在 JDK6 64 位 23 update+ 之后都默认开启了指针压缩功能.?
现在验证 java 对象占几个字节.?
- public class Person {
- ?
- ??? int age;?
- }?
我使用的是 64 位 jdk1.8, 按照理论分析, Person 对象应该占的字节数:?
8(mark Word) + 4(kclass) + 4(实例数据) + 0(不需要对齐填充) = 16B.?
而通过 visualVM 工具查看的结果也是 16B.?
现在来分析下数组的内存占用情况.?
- public class ObjectHeaderSizeTest {
- ?
- ??? public static void main(String[] args) {
- ?
- ??????? Person[] person = new Person[4];?
- ??????? System.out.println(person);?
- ??????? Thread.currentThread().suspend();?
- ???
- }?
- }?
首先我们知道 Person 对象占 16B, 那么 person 占用的字节数为:?
8 + 4 + 4 + 8 * 4 + 0 = 48B.?
喜欢这样文章的可以关注我, 我会持续更新, 你们的关注是我更新的动力! 需要更多 java 学习资料的也可以私信我!
祝关注我的人都: 身体健康, 财源广进, 福如东海, 寿比南山, 早生贵子, 从不掉发!
来源: http://www.bubuko.com/infodetail-3421570.html