什么是java中的对象图?

每当我研究垃圾收集器时,我都会听到术语对象Graph。 这究竟是什么意思?

对象具有对其他对象的引用,这些对象又可以引用更多对象,包括起始对象。 这将创建一个对象图,在可达性分析中很有用。 例如,如果起始对象是可到达的(比如它在线程的本地堆栈中),那么图中的所有对象都是可访问的,并且精确的垃圾收集器无法收集任何这些对象。 类似地,如果我们创建所有可到达对象的列表,则从一组活动对象(根)开始,所有其他对象都是垃圾公平的游戏以供收集。

“对象图”是对象模型中所有对象实例(程序中的类)及其互连的概念化。

举个例子:

你有两节课

Class Foo { String aString = "foo"; Bar aBar; } Class Bar { String aString = "boo"; } 

如果你要创建一个实例, Foo myFoo然后创建一个Bar myBar实例,并连接它们, myFoo.aBar = myBar; ,您的对象图将包含一个Foo实例,并引用一个Bar实例。

垃圾收集器基本上使用对象图来确定内存中的哪些实例仍然链接到程序可能需要的内容,以及哪些实例不再可访问,因此可以删除。


维基百科上的某个人比我更有说服力:

面向对象的应用程序包含相互关联的对象的复杂网络。 对象通过一个对象相互链接,该对象拥有或包含另一个对象或持有对另一个对象的引用。 这个对象Web称为对象图,它是更抽象的结构,可用于讨论应用程序的状态。

我们所讨论的是有向图的数学概念,它由连接节点的节点和边组成。 对象图是一些图,其节点是对象,其边是关联对象之间的关系。

对于Java垃圾收集器,关注的对象图是可达对象的图。 在此图中,节点是Java对象,边是显式或隐含的引用,允许正在运行的程序“到达”给定的其他对象。 (例如,一个隐含的引用,有一个从对象到它的Class对象的隐含引用,因此对于持有类静态及其代码的堆对象…但我离题了。)

正如@Chandra Patni解释的那样,垃圾收集的工作方式是遍历可达性图,该图包含可以从一组起点中的一个到达的所有对象; GC术语中的“根集”。 在此图遍历中找不到的任何对象都不能再影响计算,因此有资格进行垃圾回收。

对象图基本上是对象之间的依赖图

它用于确定哪些对象可以访问,哪些不可访问,以便所有无法访问的对象都可以进行垃圾回收。

对象图是我们的应用程序/软件的类的实例的网络,当前存在于内存中。

点击查看图片: http : //blog.ploeh.dk/content/binary/Windows-Live-Writer/Compose-object-graphs-with-confidence_921A/Tree_1.png

对于短的一个对象图,它也可以是一长串对象。 例如:假设我们在应用程序中有PetDog,Owner,PetKennel等类。 现在,PetDog拥有所有者,拥有者拥有一个或多个PetDog,PetDog是从PetKennel训练而PetBennel训练许多PedDog。 现在在面向对象方法中实现这些关系我们,一个所有者(假设你:所有者类的实例/对象)可能引用(链接到)许多PetDog实例(如果你有许多其他只引用一个PetDog的狗)再一次,PetDog引用了它的特定所有者实例/对象(就是你在你的狗的情况下,约翰先生将被他的狗引用(链接)),你可能从不同的狗窝俱乐部买了宠物狗(狗是训练和销售也)然后每个PetDog实例/对象引用/链接到他们特定的Kennel俱乐部。 这将创建一个彼此相关的复杂对象网络。

如果碰巧将每个实例/对象(PetDog,Owner,PetKennel的每个对象)表示为笔记/草图本中的圆形/方形(或任何形状),并绘制箭头或线条来表示哪个对象链接(引用)然后你创建一个对象图。

有时,当您删除或更改任何类的这些实例之间的链接时,某些实例可能不会被引用(链接)到将由垃圾收集器删除的任何其他实例。

我们知道对象是一个类的实例。 对象可以引用另一个对象(使用指针进行寻址)。 此外,这些对象可能引用另一个对象,因此导致对象层次结构相互引用。

这是一个对象图。