「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
回收算法
复制算法(新生代)
背景
新生代的回收算法,简单来说就是分开不同的区域,将没标记清除的对象移到空的区域上,而本来的区域就都是垃圾,一扫而空就好,然后如此循环下去。
假如,不采用这种不同区域的方式,而是直接将垃圾直接清除了,就会留下内存碎片,造成内存的浪费,而复制去一块新区域能很好地处理内存碎片问题。
又假如,就只分两块区域,是不是会造成一个区域的浪费?因为总是只有50%的区域能用,对内存的使用率太低了
复制算法的优化
Eden区和Survivor区
将新生代划分为三个区域,1个Eden区、2个Survivor区,其中Survivor 区各占10%,Eden区占80% ,这样的划分,能让使用率达到90%,
复制的原则基本不变,只是由Eden区和使用的Survivor区的存活对象,移到未使用的Survivor区,而后一扫而空。
标记整理算法(老年代)
引发Full GC 的时机
- Minor GC 前 ,检查GC后的存活对象可能很多,老年代放不下
- Minor GC 后 ,剩余对象还是太多了,放不下
标记整理算法,如其名,先标记出存活的对象,当然,这些对象可能东一个,西一个,避免存在内存碎片,然后就要整理的尽可能紧凑,避免过多碎片。
老年代的回收算法 速度至少比 年轻代的回收算法 速度慢 10呗,所以尽可能避免引发Full GC,造成系统的卡顿
Stop The World
这就不得不考虑一个场景了,比如新生代对象放不下了,触发新生代垃圾回收器进行回收,而,而,而GC期间还能创建对象吗? 如果可以,那它算什么对象呢。这就很有趣了,就会存在很多变形因子,提高回收的复杂度。因此在GC回收期间,会暂停系统程序线程,让垃圾回收器专心致志的回收垃圾。而暂停程序线程就是Stop The World。