【问题标题】:Is the address of an object fixed during its life cycle?对象的地址在其生命周期中是固定的吗?
【发布时间】:2013-11-27 17:58:08
【问题描述】:

对象的地址在其生命周期内是不变的还是可以改变的?我只是认为一个对象的地址永远不会改变。它依赖于JVM吗?我还没有找到任何明确的规范。

【问题讨论】:

  • 它的JVM内部,因为JVM将引用地址存储在局部变量中,JVM垃圾收集器在对象和引用创建后发挥作用,该对象正在使用,不可见或无法访问

标签: java object memory jvm memory-address


【解决方案1】:

java中对象的地址是不固定的;相反,它可能会改变(视情况而定)。

这是因为通常对象是在伊甸园空间中分配的。然后它们移动到幸存者空间,如果它们在一些垃圾收集周期中幸存下来,它们也会移动到老年代空间。所以它确实改变了。但是,如果对象被分配在伊甸园空间中,并且通过留在同一空间中进行垃圾收集,则地址不会改变。类似地,如果对象太大而无法在伊甸园空间中分配,那么 JVM 会在老年代分配对象,如果它通过留在分配的位置被垃圾收集,那么地址也不会改变。

还有一点你应该知道,即使一个对象停留在一代,如果是停留在同一代进行垃圾回收,地址可能会发生变化,因为它可能在进行垃圾回收时被垃圾回收器移动了,例如从伊甸园空间到幸存者,幸存者到幸存者,甚至在压缩的情况下进入老年代。

从以上条件可以看出,地址的移动是依赖于JVM的。

希望对你有帮助。

编辑

回答以下问题:

如果我创建一个新对象并将其存储在地图中,它就存储在其中 基于 hashCode(使用对象的内存生成 根据java的位置)。现在对象的地址发生了变化(导致 在不同的 hashCode 中),因此根据答案,代码永远不能 从地图中获取对象??

hashCodes 被 JVM 保存在对象头中。所以它是恒定的。在创建object 时,默认情况下它被分配给1,但是当您第一次使用该对象时,它会被计算并存储在标题中。在Object 的整个生命周期中它永远不会改变。

【讨论】:

  • 答案似乎是正确的。我只是有一个疑问,如果我创建一个新对象并将其存储在一个地图中,它是基于 hashCode 存储的(它是根据 java 使用对象的内存位置生成的)。现在对象的地址发生了变化(导致不同的hashCode),所以根据答案,代码永远无法从地图中获取对象??
【解决方案2】:

一般不会。许多 JVM 垃圾收集器会移动对象,并且该语言不保证对象的位置。

有些 GC(例如普通的 Mark&Sweep)不这样做;如果您需要此功能,可以使用支持这些功能的专用 JVM(例如 Jikes RVM 的自定义构建)。

请注意,每个对象仍然可以包含(大部分)唯一 ID(至少在我见过的 JVM 中),部分是为了支持 hashcode 的基本实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多