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

在Kotlin语言中如何获取系统存储中数据的内存地址?

Kotlin中查看变量内存地址及存储位置的方法

存储位置说明

你示例中定义的var a: Int = 0属于Kotlin的Int基本类型,它的存储位置分两种场景:

  • 方法内定义的局部变量:存储在JVM栈帧的局部变量表中,属于线程私有内存,没有独立的堆内存地址
  • 类成员变量:跟随所属的类实例一起存储在JVM堆内存中,内存地址为对象基地址+字段偏移量
    引用类型的变量本身如果是局部变量也存储在栈上,栈中存储的内容是堆内对象的引用地址

JVM平台获取内存地址的方法

JVM没有对外公开直接获取内存地址的标准API,因为垃圾回收会动态移动堆内对象,地址是瞬时可变的。调试场景下可以通过sun.misc.Unsafe内部类实现地址读取:

import sun.misc.Unsafe
import java.lang.reflect.Field

// 反射获取Unsafe实例
val unsafe: Unsafe by lazy {
    val field = Unsafe::class.java.getDeclaredField("theUnsafe")
    field.isAccessible = true
    field.get(null) as Unsafe
}

// 测试类,包含Int成员变量
class TestEntity {
    var a: Int = 0
}

fun main() {
    // 获取类成员变量a的地址
    val entity = TestEntity()
    val objBaseOffset = unsafe.arrayBaseOffset(Array<Any>::class.java)
    val objBaseAddress = unsafe.getLong(entity, objBaseOffset)
    val aFieldOffset = unsafe.objectFieldOffset(TestEntity::class.java.getDeclaredField("a"))
    val aAddress = objBaseAddress + aFieldOffset
    println("成员变量a的当前内存地址:0x${aAddress.toString(16)}")

    // 获取引用类型对象的地址
    val list = mutableListOf(1,2,3)
    val listAddress = unsafe.getLong(list, objBaseOffset)
    println("列表对象的当前内存地址:0x${listAddress.toString(16)}")
}

注意:sun.misc.Unsafe属于JDK内部非公开API,不同JDK版本的实现可能存在差异,仅可用于调试场景,禁止在生产环境中使用。另外System.identityHashCode()返回的是对象的唯一标识哈希值,并非真实内存地址。

非JVM平台的实现

  • Kotlin/Native:可以直接使用官方提供的Cinterop能力获取内存地址,示例如下:
import kotlinx.cinterop.addressOf
import kotlinx.cinterop.usePinned

fun main() {
    val a: Int = 0
    // 装箱后pin住内存避免移动,再读取地址
    (a as Int).usePinned { pinned ->
        println("变量a的内存地址:${pinned.addressOf(0)}")
    }
}
  • Kotlin/JS:运行在JavaScript引擎之上,底层没有暴露内存地址相关能力,无法获取变量的存储地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:48:05