1. 垃圾标记原理
GC ROOT , 通过引用标记来识别哪些是垃圾
GC ROOT 范围 : 被栈中声明引用的,被方法区内静态变量声明引用的 等
2. 垃圾回收算法
2.1 复制清除法
两块内存,一块用于空闲,一块用于使用,当被使用的内存占满后,将未被标记的转移到空闲内存,互换两块内存的角色,达到循环复制,清理掉垃圾的目的;(有碎片,但是快)
2.2 标记清除法
标记需要被清理的,然后stw清理被标记为垃圾的内存(有内存碎片产生,造成浪费)
2.3 标记整理法
标记需要被清理的,然后进行整理将未被标记的内存整理到连续的内存区域,在进行清理(没有内存碎片)
3. 垃圾回收器
3.1 CMS
CMS 针对老年代的回收器,主要流程为
1、初始标记(CMS initial mark)。
2、并发标记(CMS concurrent mark)。
3、最终标记(CMS remark)。
4、并发清除(CMS concurrent sweep)。
其中 ,初始标记 , 最终标记 需要 STW;
缺点 : 采用标记清理算法,会产生内存碎片
补偿 : 可通过启动参数,指定每隔一段时间进行一次碎片整理
问题 : 如何处理CMS 内存碎片问题
1 增大Xmx或者减少Xmn
2 在应用访问量最低的时候,在程序中主动调用System.gc(),比如每天凌晨。
3 在应用启动并完成所有初始化工作后,主动调用System.gc(),它可以将初始化的数据压缩到一个单独的chunk中,以腾出更多的连续内存空间给新生代晋升使用。
4 降低-XX:CMSInitiatingOccupancyFraction参数以提早执行CMSGC动作,虽然CMSGC不会进行内存碎片的压缩整理,但它会合并老生代中相邻的free空间。这样就可以容纳更多的新生代晋升行为
3.2 G1
G1 针对老年代和年轻代的回收器,主要流程为
1、初始标记
只标记GC ROOT 直接引用的对象
2、并发标记
GC ROOT 的直接饮用对象 tracing 过程
3、最终标记
修整并发过程中的已经释放的垃圾
4、并发清除
根据设置的预期时间进行最大垃圾优先原则回收
其中 ,初始标记 , 最终标记 需要 STW;
相比于 CMS 的优点 : ① 不会产生内存碎片 ② 可比较精准的控制停顿时间(在启动参数进行指定,在最终回收时会根据时间来进行非全量回收)
评论区