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

标签 java object memory jvm memory-address

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

最佳答案

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

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

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

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

希望对你有帮助。

编辑

回答以下问题:

if I create a new Object and store it in a map, where it is stored based on hashCode (which is generated using the object's memory location as per java). Now the address of the object changed(resulting in a different hashCode), so as per the answer, the code can never fetch the object from the map??

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

关于java - 对象的地址在其生命周期内是否固定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20249723/

相关文章:

java - 我从来没有见过以jar形式发布的软件,那么我怎样才能让一个软件也以exe形式发布呢?

ios - 使对象随时可用以获得更好的性能

Java,LibGDX - 高斯模糊颜色分离器问题 - 接收负值

java - HBase 未在 Windows 上以独立模式启动

java - Hibernate with H2 不存储数据

c# - Xamarin C# - IMKAnnotation 不包含 'x' 的定义

Symfony3 : choice type field filled with array of objects

javascript - 循环从二维数组创建对象键和值

c++ - 我的 C++ 软件是太多 exe 的集合,我该如何管理它

memory - Visual Studio 不会显示的其他托管堆内有什么?