写点什么

架构师训练营第九周课后作业

用户头像
万有引力
关注
发布于: 2021 年 01 月 23 日

请简述 JVM 垃圾回收原理



是什么


JVM 的垃圾回收就是将 JVM 堆中的无效对象清除掉,以释放内存空间的过程。


怎么做


垃圾回收的一般做法主要分为两个阶段:

  • 标记。识别出要程序不再使用的对象;

  • 清理。将要回收的对象占用的内存空间释放。在 JVM 中,根据内存所处的不同区域,内存清理后的整理策略也不一致;


标记


JVM 通过可达性分析算法识别出待回收的无效对象。

  • 从线程栈帧中的局部变量,或者从方法区的静态变量出发

  • 将变量引用的对象进行标记,再进入被标记的对象,标记其中引用的其它对象

  • 此递归标记的过程进行到所有引用到的对象被标记完为止

  • 没有标记到的对象即无效对象,也就是下个阶段要清理的目标


整理


JVM 的堆内存分为几个区域,其内存的回收策略也不尽一致:

  • 年轻代,MinorGC,算法复杂度低,空间换时间

- Eden 区。该区域使用标记-复制策略,将存活的对象复制到 Survivor 其中的一个分区,清除 Eden 区所有数据;

- Survivor 区。该区域使用标记复制策略,将存活的对象复制到 Survivor 另一分区,清除当前 Survivor 区所有数据;

  • 老年代,MajorGC,算法复杂度较高

- 当 Survivor 区的数据存活一定周期后,将复制到老年代;

- 老年代使用标记-整理策略,将无效对象回收,然后将存活的对象重新整理,减少内存碎片,释放出连续的内存区域;


时机

  • 年轻代 Eden 区满,触发 MinorGC

  • 年老代满,触发 MajorGC


发布于: 2021 年 01 月 23 日阅读数: 13
用户头像

万有引力

关注

还未添加个人签名 2018.05.30 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第九周课后作业