据我了解,如果对象 A 将对象 B 的引用作为其实例变量,则该引用存储在堆上为对象 A 分配的空间内。但对象 B 本身存储在堆上的其他位置,位于为对象 A 分配的空间之外。
这种理解准确吗?以这种方式进行内存分配(与将对象 B 放在堆上的对象 A 中相比)有什么优点?
这对 Java 垃圾收集机制的性能有什么影响(正面或负面)(即,如果对象 A 被销毁)?
最佳答案
主要好处之一是对象的独立性 - 如果 B 是在 A 内分配的,则只有在收集 A 时才能收集 B。
作为堆上的单独对象,B 现在可以独立于 A 在其他地方传递和引用,并且 B 将拥有自己的生命周期。
垃圾收集器会知道何时没有对任一对象的进一步根引用 - 例如即使 A 被收集,仍然可能有其他对 B 的引用,这将延长其生命周期。
关于java - 对象内对象的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31614968/