垃圾收集器使用垃圾收集根(GC根)的概念来识别活的和死的对象。
此类垃圾收集根的示例包括:
l 由系统类装入器(非自定义类装入器)装入的类
l 实时线程
l 当前执行方法的局部变量和参数
l JNI方法的局部变量和参数
l 全球JNI参考
l 用作同步监视器的对象
l JVM出于垃圾收集目的而保留的对象
垃圾收集器遍历内存中的整个对象图,从那些垃圾收集根开始,并遵循从根到其他对象的引用。
标准垃圾收集实施包括三个阶段:
在这一步中,GC通过遍历对象图来识别内存中的所有活动对象。
当GC访问一个对象时,它将其标记为可访问的,因此是活动的。垃圾收集器访问的每个对象都标记为活动。所有不能从GC根访问的对象都是垃圾,并被视为垃圾收集的候选对象。
在标记阶段之后,内存空间被活动(已访问)和死亡(未访问)对象占用。扫描阶段释放包含这些死对象的内存碎片。
3.压缩内存中的剩余对象
扫描阶段移除的固定对象不一定相邻。因此,最终可能会有零碎的内存空间。
在垃圾收集器删除死对象后,可以压缩内存,以便剩余的对象位于堆开始处的连续块中。
压缩过程使按顺序为新对象分配内存变得更容易。
发表评论 取消回复