写点什么

Week_09 作业

用户头像
golangboy
关注
发布于: 2020 年 11 月 23 日

java 虚拟机的垃圾回收

对共享的数据区(堆)中的不在使用的对象进行回收。

回收策略

  1. 标记

  • 从线程栈中的局部变量找

  • 从方法区的静态变量找

  • 从上述找到的对象中查看是否有其他对象的引用,有则标记

  • 标记了表示不能被回收,否则可回收

  1. 清除

  • 清理:清除垃圾对象,将其内存放入空闲列表,以便后续分配使用

  • 压缩:将清除后出现空洞的堆空间,进行压缩。(将存活对象拷贝到连续空间内,保证堆空间的连续性)

  • 复制:将堆空间分成 2 块,一块用于创建对象,当这块空间用完后,将其中还活着的对象复制到另一个空间,完成清除工作

分代垃圾回收

java 以复制的方式进行垃圾回收,具体回收过程如下:

  1. 将堆内存分为两大部分:新生代和老年代

  2. 新生代中又分为:Eden 区,From 区,To 区

  3. 对象内存分配时,在 eden 区进行分配

  4. 当 eden 区对象内存分配达到一定比例或者满时,触发垃圾回收

  5. 将 eden 区无用对象进行回收,剩余有用对象被复制到 From 区,然后清空 eden 区

  6. 第一次回收结束,程序继续运行

  7. 新的对象又在 eden 区中产生,且再次触发 gc,重复上述步骤

  8. 如果 From 区放不下时,将 Eden 和 From 区所有对象都复制到 To 区,同时清空 Eden 区和 From 区

  9. 第二次回收结束,程序继续运行

  10. eden 区再次触发 gc,此时会将 eden 和 to 区对象复制到 from 区,清空 eden 和 to 区

  11. 第三次回收结束,程序继续运行,重复往返的执行上述过程

  12. 如果有些对象在多次 gc 后,还 From 区或者 To 区存在,则说明该对象生命周期长,将这些对象复制到老年代

  13. 当老年代空间也满时,触发一次新生代和老年代的全量 gc

垃圾回收算法

  • 串行回收器:应用程序并行执行,有 GC 时,挂起应用程序线程。然后启动一个垃圾回收线程进行回收,回收完毕后,应用程序线程继续执行

  • 并行回收器:在多核时代,为了提高回收效率,用多个回收线程进行回收工作

  • 并发回收器 CMS:将回收过程进一步细化,标记过程分为初始标记,并发标记,重标记,并发清理 4 个阶段。初始标记时,进行 stop the world,短时间内标记完。之后进入并发标记阶段,用户线程和 gc 线程同时运行。在并发标记的过程中,又有新的对象产生,之前标记的可能不准,因此进入重标记阶段。在该阶段,为了防止误删,会进行 stop the world。之后将标记好的进行并发清理

  • G1 回收器:将 eden 区,from,to 区,老年期分的粒度更细,然后对这些区域进行控制,回收时,不必整块内存区去遍历


用户头像

golangboy

关注

还未添加个人签名 2018.09.18 加入

还未添加个人简介

评论

发布
暂无评论
Week_09 作业