对象的地址在其生命周期中是否固定?

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

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

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

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

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

希望能帮助到你。

编辑

回答以下问题:

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

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

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

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

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