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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:55:10