Kotlin类实例堆内存占用大小排序及相关技术疑问
Kotlin类实例堆内存占用分析
第一组示例
class A ( val x: Int = 999, val y: Int get() = 999, var z: Int = -1 ) class B ( val x: Int = 0, val y: Int = 999, val z: Int = -1 ) class C ( x: Int = 999, y: Int = 999, z: Int = 999 )
内存占用排序(从大到小)
B > A > C
关键问题解答
- 未声明val/var的构造参数是否影响内存?
不会。C类中的x、y、z只是构造函数的局部参数,未被val/var修饰,不会成为类的实例字段,因此不占用堆内存。C类实例仅包含对象头(64位JVM下通常为16字节),无额外字段。 - 自定义getter方法是否改变内存占用?
不会。A类中val y的getter是自定义实现,没有对应的幕后字段,getter方法本身属于类成员,存储在方法区而非实例堆内存。A类实例字段仅x(4字节)和z(4字节),加上对象头,总占用小于B类。 - B类的三个
val均为实例字段,每个占4字节,共12字节,加上对象头,是三者中占用最大的。
第二组示例
class A { fun foo() = 123456 val nr: Int get() = 7658894 val foo: Int get() = nr class B(val bar: Int, val foo: Int) class C(val bar: Int) { val nr: Int get() = bar fun foo() = nr fun oper(num: Int): Int { val x = num + 1 val y = num - 1 return x * y } } }
内存占用排序(从大到小)
B > C > A
关键问题解答
- 类中声明的函数是否影响实例内存?
不会。A类中的所有函数、带自定义getter的val(无幕后字段)都是类级成员,存储在方法区,不占用实例堆内存。A类无任何实例字段,仅含对象头,占用最小。 - 仅含类参数的B类情况?
B类的bar和foo是val修饰的构造参数,会成为实例字段,每个占4字节,共8字节,加上对象头,是三者中占用最大的。 - 包含参数、getter及带内部变量函数的C类情况?
C类仅bar一个实例字段(4字节),加上对象头。其中的getter、函数均为类成员,不占用实例内存;函数内部的x、y是执行时的栈局部变量,与堆内存无关。因此C类实例占用小于B类,大于A类。
内容的提问来源于stack exchange,提问作者nuno
相关产品推荐
相关产品推荐

