Cha*_*tni 32
对象具有对其他对象的引用,这些对象又可以引用包括起始对象在内的更多对象.这将创建一个对象图,在可达性分析中很有用.例如,如果起始对象是可到达的(比如它在线程的本地堆栈中),则图中的所有对象都是可访问的,并且精确的垃圾收集器无法收集任何这些对象.同样,如果我们创建一个包含所有可到达对象的列表,则从一组活动对象(根)开始,所有其他对象都是垃圾公平的游戏集合.
Tom*_*and 19
"对象图"是对象模型中所有对象实例(程序中的类)及其互连的概念化.
举个例子:
你有两节课
Class Foo
{
String aString = "foo";
Bar aBar;
}
Class Bar
{
String aString = "boo";
}
Run Code Online (Sandbox Code Playgroud)
如果要创建实例,Foo myFoo然后创建实例Bar myBar并连接它们,则myFoo.aBar = myBar;对象图将包含一个实例,Foo其中包含对单个实例的引用Bar.
垃圾收集器本质上使用对象图来确定内存中的哪些实例仍然链接到程序可能需要的内容,以及哪些实例不再可访问,因此可以删除.
维基百科上的某个人比我更有说服力:
面向对象的应用程序包含相互关联的对象的复杂网络.对象通过一个对象相互链接,该对象拥有或包含另一个对象或持有对另一个对象的引用.这个对象Web称为对象图,它是更抽象的结构,可用于讨论应用程序的状态.
我们所谈论的是有向图的数学概念,它由连接节点的节点和边组成.对象图是一些图,其节点是对象,其边是关联对象之间的关系.
在Java垃圾收集器的情况下,关注的对象图是可达对象的图.在此图中,节点是Java对象,边是显式或隐含的引用,允许正在运行的程序"到达"给定的其他对象.(例如,隐含引用,有一个从对象到它的Class对象的隐含引用,因此对于持有类静态及其代码的堆对象...但我离题了.)
正如@Chandra Patni解释的那样,垃圾收集的工作方式是遍历可达性图,该图包含可以从一组起始点之一到达的所有对象; GC术语中的"根集".在此图遍历中找不到的任何对象都不能再影响计算,因此有资格进行垃圾回收.
| 归档时间: |
|
| 查看次数: |
19517 次 |
| 最近记录: |