在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
相关产品推荐
相关产品推荐

