垃圾收集器使用垃圾收集根(GC根)的概念来识别活的和死的对象。

此类垃圾收集根的示例包括:

l 由系统类装入器(非自定义类装入器)装入的类

l 实时线程

l 当前执行方法的局部变量和参数

l JNI方法的局部变量和参数

l 全球JNI参考

l 用作同步监视器的对象

l JVM出于垃圾收集目的而保留的对象

垃圾收集器遍历内存中的整个对象图,从那些垃圾收集根开始,并遵循从根到其他对象的引用。

  

标准垃圾收集实施包括三个阶段:

  1.将对象标记为活动

在这一步中,GC通过遍历对象图来识别内存中的所有活动对象。

当GC访问一个对象时,它将其标记为可访问的,因此是活动的。垃圾收集器访问的每个对象都标记为活动。所有不能从GC根访问的对象都是垃圾,并被视为垃圾收集的候选对象。

  2.扫描死对象

在标记阶段之后,内存空间被活动(已访问)和死亡(未访问)对象占用。扫描阶段释放包含这些死对象的内存碎片。

3.压缩内存中的剩余对象

扫描阶段移除的固定对象不一定相邻。因此,最终可能会有零碎的内存空间。

在垃圾收集器删除死对象后,可以压缩内存,以便剩余的对象位于堆开始处的连续块中。

压缩过程使按顺序为新对象分配内存变得更容易。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部