Java 对象内对象的内存分配

Java 对象内对象的内存分配,java,performance,object,memory-management,garbage-collection,Java,Performance,Object,Memory Management,Garbage Collection,据我所知,如果对象A有一个对对象B的引用作为其实例变量,那么该引用存储在堆上为对象A分配的空间中。但是对象B本身存储在堆的其他地方,在为对象A分配的空间之外 这种理解准确吗?以这种方式进行内存分配(相对于在堆上的对象A中有对象B)有什么好处 这(正面或负面)对Java垃圾收集机制的性能有什么影响(即,如果对象A被销毁)?一个主要好处是对象的独立性-如果在A中分配B,则B只能在收集A时收集 作为堆上的独立对象,B现在可以独立于A在别处传递和引用,B将有自己的生命周期 垃圾收集器将知道何时不再有对任

据我所知,如果对象A有一个对对象B的引用作为其实例变量,那么该引用存储在堆上为对象A分配的空间中。但是对象B本身存储在堆的其他地方,在为对象A分配的空间之外

这种理解准确吗?以这种方式进行内存分配(相对于在堆上的对象A中有对象B)有什么好处


这(正面或负面)对Java垃圾收集机制的性能有什么影响(即,如果对象A被销毁)?

一个主要好处是对象的独立性-如果在A中分配B,则B只能在收集A时收集

作为堆上的独立对象,B现在可以独立于A在别处传递和引用,B将有自己的生命周期


垃圾收集器将知道何时不再有对任一对象的根引用-例如,即使收集了A,也可能还有对B的其他引用,这将延长其寿命。

B
s实例也可能独立创建,或者它们可以用作其他对象的实例字段,例如,对象
C
。如果您在
A
C
中有
B
的实例,则需要“复制”
B
s,或者让
C
引用
A
以获得
B
(显然不是一个好主意)

因此,对象有自己的分配空间,当它们需要引用其他对象的特定实例时,它们只存储指向其位置的“指针”

此外,按照您的示例,如果您有以下代码:

class A {
    private B myB = new B();

    public B getB() { return this.myB; }
}
还有一些代码,比如从对象C调用
bmyb=myA.getB()
,则您不希望将
C
的实例绑定到
A
。如果
A
得到GC'd,那么
C
仍然可以保持其
B
正常。这是因为
B
未耦合到
A
或任何其他对象(内存方面)


最后,与最后一点相关的是,记住GC是基于对象图的,只收集不可访问的节点。通过将
A
s、
B
s和
C
s作为独立节点(顶点)并引用图形中的连接箭头(边),可以大大简化这一过程。

您的建议(“对象”烘焙在其父对象的内存中)将包含在以下内容中。另请参见

假设两个不同的对象引用了对象B。在您提出的方案中,您将如何表示这一点?我明白了。jvm为对象B分配mem的方式很有意义。