对象的地址在其生命周期中是不变的还是可以改变?我只是觉得一个对象的地址永远不会改变。它是JVM依赖的吗?我没有找到任何明确的规格。
答案 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
的基本实现。