You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

确认包含自定义对象成员的Kotlin类内存占用计算是否正确

关于Kotlin/Java中SampleClass对象大小的问题解答

你的核心理解是正确的,但有几个JVM层面的细节需要补充,不能直接得出SampleClass对象大小是32字节的结论:

1. 核心逻辑的正确部分

SampleClass的实例仅持有以下内容,Obj1和Obj2的实例大小完全不影响SampleClass的大小——因为SampleClass只存储指向这些实例的引用,而非实例本身:

  • 基本类型IntVal(4字节)、FloatVal(4字节)
  • 两个对象引用Object1、Object2(64位JVM下每个引用占8字节,32位JVM下占4字节)

2. JVM对象的额外固定开销

JVM中每个对象的大小还包含两类必须计算的开销:

  • 对象头(Object Header):存储对象元数据(哈希码、锁状态、类指针等)。64位JVM默认开启指针压缩时占12字节,未开启时占16字节;32位JVM下一般占8字节。
  • 内存对齐:JVM会将对象总大小对齐到8字节的倍数(64位)或4字节的倍数(32位),以此优化内存访问效率。

3. 实际计算SampleClass的大小(以64位JVM默认配置为例)

  • 成员变量总大小:4 + 4 + 8*2 = 24字节
  • 加上对象头12字节,总大小为24 + 12 = 36字节
  • 内存对齐到8字节倍数,最终大小为40字节

若关闭指针压缩,对象头为16字节,24 + 16 = 40字节刚好满足对齐要求,最终大小仍为40字节。

总结

你关于“SampleClass仅持有引用,Obj1/Obj2的大小不影响它”的结论完全正确,但忽略了JVM对象的固定开销和内存对齐规则,因此实际大小并非32字节,具体数值会根据JVM配置有所变化。

内容的提问来源于stack exchange,提问作者Jatin guglani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:11:06