GC分代算法的简单理解 第一次使用博客,作为一名即将毕业的小程序猿内心惶恐,写下一点自己的总结和想法,期待前辈们的指教。
GC 简单理解就是用来回收已经无用的对象来节省内存空间,判断对象无用的标准是该对象不再被程序中任何一个活动中的部分所引用。当堆内存使用率超过70%时,CG就会启动。
分代回收算法
GC将堆内存分为新生代和老生代两部分,新生代中使用复制算法,老生代中使用标记整理算法。下面会有这些算法的详细描述。
新生代 在新生代中又分为一块伊甸园区和两块幸存区。内存比列为8:1:1。两块幸存区每次只使用一块。
回收时将伊甸园区 和幸存区的存活对象复制到另外一块幸存区中,再清理掉使用过的伊甸园区和幸存区。
如果在垃圾回收时一块幸存区放不下所有存活对象,会发生内存担保机制,将存活对象存在老生代中
老生代 对象进入老生代有两个方法,存活次数达到默认的15次,或者发生率老生代的内存担保机制。
老生代中发生的GC就是Full GC
算法
判定对象回收算法
1.引用计数算法
为对象创建计数器,被引用时+1,引用失效-1,为0时回收。缺点无法解决对象互相引用问题
2.可达性分析算法
以GC Roots对象作为起点,当对象与它中间没有引用链时回收。
垃圾收集算法
1.标记-清除算法
先将要回收的对象标记,再回收,是最基础的收集算法。缺点是会产生大量不连续内存空间。导致后续无法分配较大的对象。
2.复制算法
将内存容量分成相等的两块,每次只使用其中一块,当这块内存用完时将存活对象转移在另一块上,再将使用过的空间进行清理。
3.标记整理算法
将需要回收对象进行标记,清理时存活对象向一端移动,清理其余的内存空间。
GC收集器 由于所学不深,主要介绍常见的两款收集器 :
CMS收集器
是第一款真正意义上的并发收集器,第一次实现了垃圾收集进程与用户线程同时基本上工作。
G1
【小白系列之通俗易懂的GC分代算法】将整个堆内存分为若干预先设定的小区域块,将区域块标记为伊甸园区、幸存区、老生代。内存利用率特别高,内存越大优势越明显。