【发布时间】:2013-11-27 17:58:08
【问题描述】:
对象的地址在其生命周期内是不变的还是可以改变的?我只是认为一个对象的地址永远不会改变。它依赖于JVM吗?我还没有找到任何明确的规范。
【问题讨论】:
-
它的JVM内部,因为JVM将引用地址存储在局部变量中,JVM垃圾收集器在对象和引用创建后发挥作用,该对象正在使用,不可见或无法访问
标签: java object memory jvm memory-address
对象的地址在其生命周期内是不变的还是可以改变的?我只是认为一个对象的地址永远不会改变。它依赖于JVM吗?我还没有找到任何明确的规范。
【问题讨论】:
标签: java object memory jvm memory-address
java中对象的地址是不固定的;相反,它可能会改变(视情况而定)。
这是因为通常对象是在伊甸园空间中分配的。然后它们移动到幸存者空间,如果它们在一些垃圾收集周期中幸存下来,它们也会移动到老年代空间。所以它确实改变了。但是,如果对象被分配在伊甸园空间中,并且通过留在同一空间中进行垃圾收集,则地址不会改变。类似地,如果对象太大而无法在伊甸园空间中分配,那么 JVM 会在老年代分配对象,如果它通过留在分配的位置被垃圾收集,那么地址也不会改变。
还有一点你应该知道,即使一个对象停留在一代,如果是停留在同一代进行垃圾回收,地址可能会发生变化,因为它可能在进行垃圾回收时被垃圾回收器移动了,例如从伊甸园空间到幸存者,幸存者到幸存者,甚至在压缩的情况下进入老年代。
从以上条件可以看出,地址的移动是依赖于JVM的。
希望对你有帮助。
编辑
回答以下问题:
如果我创建一个新对象并将其存储在地图中,它就存储在其中 基于 hashCode(使用对象的内存生成 根据java的位置)。现在对象的地址发生了变化(导致 在不同的 hashCode 中),因此根据答案,代码永远不能 从地图中获取对象??
hashCodes 被 JVM 保存在对象头中。所以它是恒定的。在创建object 时,默认情况下它被分配给1,但是当您第一次使用该对象时,它会被计算并存储在标题中。在Object 的整个生命周期中它永远不会改变。
【讨论】:
一般不会。许多 JVM 垃圾收集器会移动对象,并且该语言不保证对象的位置。
有些 GC(例如普通的 Mark&Sweep)不这样做;如果您需要此功能,可以使用支持这些功能的专用 JVM(例如 Jikes RVM 的自定义构建)。
请注意,每个对象仍然可以包含(大部分)唯一 ID(至少在我见过的 JVM 中),部分是为了支持 hashcode 的基本实现。
【讨论】: