架构师训练营第九周课后作业
请简述 JVM 垃圾回收原理
是什么
JVM 的垃圾回收就是将 JVM 堆中的无效对象清除掉,以释放内存空间的过程。
怎么做
垃圾回收的一般做法主要分为两个阶段:
标记。识别出要程序不再使用的对象;
清理。将要回收的对象占用的内存空间释放。在 JVM 中,根据内存所处的不同区域,内存清理后的整理策略也不一致;
标记
JVM 通过可达性分析算法识别出待回收的无效对象。
从线程栈帧中的局部变量,或者从方法区的静态变量出发
将变量引用的对象进行标记,再进入被标记的对象,标记其中引用的其它对象
此递归标记的过程进行到所有引用到的对象被标记完为止
没有标记到的对象即无效对象,也就是下个阶段要清理的目标
整理
JVM 的堆内存分为几个区域,其内存的回收策略也不尽一致:
年轻代,MinorGC,算法复杂度低,空间换时间
- Eden 区。该区域使用标记-复制策略,将存活的对象复制到 Survivor 其中的一个分区,清除 Eden 区所有数据;
- Survivor 区。该区域使用标记复制策略,将存活的对象复制到 Survivor 另一分区,清除当前 Survivor 区所有数据;
老年代,MajorGC,算法复杂度较高
- 当 Survivor 区的数据存活一定周期后,将复制到老年代;
- 老年代使用标记-整理策略,将无效对象回收,然后将存活的对象重新整理,减少内存碎片,释放出连续的内存区域;
时机
年轻代 Eden 区满,触发 MinorGC
年老代满,触发 MajorGC
版权声明: 本文为 InfoQ 作者【万有引力】的原创文章。
原文链接:【http://xie.infoq.cn/article/7f11f7b8b1b8c4f19f81a4a01】。未经作者许可,禁止转载。
评论