包含自定义对象作为数据成员的 Kotlin 类的大小

问题描述 投票:0回答:1

我知道在 Kotlin(或 Java)中,对象是引用类型。即

private var Object1: Obj1? = Obj1()

这里 var Object1 是对类 Obj1 实例(在堆上)的引用(8 个字节)。

因此,如果我有这样的课程:

class SampleClass {

private var IntVal: Int = 0
private var FloatVal: Float = 0F
private var Object1: Obj1? = Obj1 ()
private var Object2: Obj2? = Obj2 ()
}

其中 Obj1 和 Obj2 是自定义类:

class Obj1 {

private var IntVal1: Int = 0
private var IntVal2: Int = 0
private var IntVal3: Int = 0
}

class Obj2 {

private var FloatVal1: Float = 0F
private var FloatVal2: Float = 0F
private var FloatVal3: Float = 0F
}

我可以说 SampleClass 对象的大小将等于 IntVal 的大小(Int:4 字节)+ FloatVal 的大小(float:4 字节)+ 两个对象引用的大小,即 8*2:16 字节。

因此,无论类 obj1 和 obj2 的大小是多少,SampleClass 的大小将始终是固定的(32 字节),因为它保存 obj1 和 obj2 对象的引用,而不是实际对象本身。

请告诉我我的理解是否正确。

java kotlin memory-management reference heap-memory
1个回答
0
投票

确实,

SampleClass
的实例只会保存对对象的引用,而不是对象本身。这些独立于该实例。也就是说,每当创建
Object1
的新实例时,属性
Object2
SampleClass
都会填充新对象。因此,消耗的总内存始终包括 1 个
Obj1
和 1 个
Obj2
实例所需的额外空间。

当您在创建

Object1
实例后将
Object2
null
设置为
SampleClass
时,您只会删除 reference。对象仍然存在于内存中并占用内存。这就是垃圾收集器发挥作用的地方:它观察所有对象并计算每个对象存在多少个引用。如果删除了对对象的最后一个引用,则会从内存中删除该对象。这一切都会在后台自动发生,您无需执行任何操作即可实现此目的。然而,具体何时发生这种情况尚不确定。这取决于垃圾收集器的内部结构。

因此,对象彼此独立,并且每个对象都有自己的大小。它们可以一起创建,但每个对象都有自己的生命周期,该生命周期由引用的频率决定,并将相应地进行清理,也独立于其他对象(当然,除非它们持有引用)。

一个对象实际消耗多少内存是很难预测的。它至少是它的引用和它(及其所有父级)包含的原语的总和,但是 JVM 会使用一些额外的开销来管理对象。但这并不容易确定。

© www.soinside.com 2019 - 2024. All rights reserved.