你写的Java对象究竟占多少内存?

本文详细探讨了Java对象在内存中的占用情况,特别是在64位JDK 1.8(开启指针压缩)环境下,一个空对象至少占用12字节,实际由于内存对齐填充至16字节。通过对象头的Mark Word和Klass Word,分析了不同锁状态下的内存布局,并使用jol工具进行了验证。非空对象的内存占用除了对象头外,还包括成员变量和引用的内存消耗,以及可能的内存对齐填充。
摘要由CSDN通过智能技术生成

Java 作为一个面向对象语言,给我们带来了多态,继承,封装等特性,使得我们可以利用这些特性很轻松的就能构建出易于扩展,易于维护的代码。

作为一个Javaer,天天搞“对象”,那你写的对象究竟占用了多少内存呢?

我们来看看你的“对象”是如何“败家”的。

本文环境:jdk1.8_64

Java 对象头内存模型

我们先来看看,一个Java 对象的内存模型是怎么样的?

由于我们的虚拟机是分为32位和64位,那肯定它们的模型也是有区别的,下面我列出列32位虚拟机和64位虚拟机下的Java对象头内存模型。

file

file

file

因为笔者的本地环境是jdk1.8,64位虚拟机,这里我以64位虚拟机(开启指针压缩)来分析,因为默认情况下,jdk1.8 在64位虚拟机默认开启指针压缩。

Java 对象头主要包括两部分,第一部分就是 Mark Word,这也是 Java 锁实现原理中重要的一环,另外一部分是 Klass Word。

Klass Word 这里其实是虚拟机设计的一个oop-klass model模型,这里的OOP是指Ordinary Object Pointer(普通对象指针),看起来像个指针实际上是藏在指针里的对象。而 klass 则包含 元数据和方法信息,用来描述 Java 类。它在64位虚拟机开启压缩指针的环境下占用 32bits 空间。

Mark Word 是我们分析的重点,这里也会设计到锁的相关知识。Mark Word 在64位虚拟机环境下占用 64bits 空间。

整个Mark Word的分配有几种情况:

  • 未锁定(Normal): 哈希码(identity_hashcode)占用31bits,分代年龄(age)占
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值