Sur*_*tta 9 java memory jvm object memory-address
对象的地址在其生命周期中是不变的还是可以改变?我只是觉得一个对象的地址永远不会改变.它是JVM依赖的吗?我没有找到任何明确的规格.
java中对象的地址不固定; 相反,它可能会改变(受条件限制).
这是因为通常在eden空间中分配对象.然后他们移动到幸存者空间,然后如果他们在一些垃圾收集周期中幸存下来也移动到老一代空间.所以它确实改变了.但是如果对象在eden空间中分配并且通过停留在同一空间中而收集垃圾,那么地址将不会改变.类似地,如果对象太大而无法在eden空间中分配,那么JVM会在旧代中分配对象,如果通过停留在分配位置进行垃圾回收,那么地址也不会改变.
还有一件事你应该知道,即使一个对象停留在一代中,如果它是通过停留在同一代中而被垃圾收集,则地址可能会改变,因为它可能在进行垃圾收集时被垃圾收集器移动,例如来自伊甸园空间幸存者,幸存者幸存者甚至是压缩事件中的老一代.
从上述条件可以清楚地看出,地址的移动取决于JVM.
希望能帮助到你.
编辑
回答以下问题:
如果我创建一个新的Object并将其存储在一个地图中,它将根据hashCode存储它(使用该对象的内存位置根据java生成).现在对象的地址发生了变化(产生了不同的hashCode),所以根据答案,代码永远不能从地图中获取对象??
hashCodes由JVM保存在对象头中.所以它是不变的.创建object它1时默认情况下会分配它,但是当您第一次使用该对象时,它会被计算并存储在标题中.它永远不会改变整个生命周期Object.