对象的地址在其生命周期中是否已修复?

时间:2013-11-27 17:58:09

标签: java object memory jvm memory-address

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

2 个答案:

答案 0 :(得分:5)

java中对象的地址不固定;相反,它可能会改变(受条件限制)。

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

还有一件事你应该知道,即使一个对象停留在一代中,如果它是通过停留在同一代中进行垃圾收集,地址可能会改变,因为它可能在进行垃圾收集时被垃圾收集器移动,例如从伊甸园空间到幸存者,幸存者到幸存者,甚至在压缩事件中进入老一代。

从上述条件可以清楚地看出,地址的移动取决于JVM。

希望它有所帮助。

修改

回答以下问题:

  

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

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

答案 1 :(得分:1)

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

有一些GC(例如普通的Mark& Sweep)没有;如果需要此功能,可以使用支持这些的专用JVM(例如Jikes RVM的自定义版本)。

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