之前写过一篇边界标识内存管理算法,在分配内存端,分配算法没问题,有很多种,首次适应、最佳适应、最坏适应法等,分配的时机,看用户什么时候申请。在回收端,回收情况分很四种:左/右临界区为空闲块、左右临界区均为空闲块和左右临界区均不为空,根据不同的情况,空闲块回收的方法也不同。那么回收的时机呢?在C语言中,我们要显式地使用free()来回收不再使用的内存,在Java里,我们不需要这么做,自动回收机制会帮我们这么做,它又是怎么实现的呢?它怎么知道当前哪些对象不被使用,哪些对象可以被回收了呢?
在程序执行过程中,很多对象的引用和变量的使用,我们随时都可以访问到这些对象,而对于那些不能被直接访问到的对象,就应该被回收,以释放内存给新的对象使用。那么怎么知道哪些对象能被直接访问到,哪些对象不能被访问?我们看,对象的引用就像指针,把对象看做一个顶点,一个对象对另一个对象的应用看作一个箭头相连,那么多个对象之间的引用关系就构成了一个有向图。
在有向图中,一个顶点可以到达另一个顶点,那么就认为这两个顶点是连通的,就像一个对象可以直接或间接地访问到另一个对象。遍历有向图,找出所有不能被访问的顶点,然后把它们回收,实际的内存管理中回收机制也是这样的,一个顶点表示一个对象,对象之间的引用表示一条边,至于寻找图中无法被访问的顶点,那就是用到有向图中顶点可达性的寻找方法。给定的某一个顶点或是一组顶点,在图中遍历寻找所有从