确认包含自定义对象成员的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
相关产品推荐
相关产品推荐

