河南工程建设信息网站/网络营销的五大特点
-
GC作用区域
-
方法区和堆
-
-
GC是什么
-
分代收集算法
-
次数上频繁收集Yong区
-
次数上较少收集Old区
-
基本不动Perm区
-
-
-
GC的4大算法
-
GC算法的总体概述
-
JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。
-
因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC),一种是全局GC(major GC or Full GC),
-
普通GC(minor GC):只针对新生代区域的GC。
-
全局GC(major GC or Full GC):针对年老代的GC,偶尔伴随对新生代的GC以及对永久代的GC。
-
-
4大算法
-
引用计数法:
-
缺点
-
每次对对象赋值时均要维护引用计数器,且计数器本身也有一定的消耗。
-
较难处理循环引用。
-
-
-
复制算法:
-
年轻代中使用的是Minor(maɪnə) GC,这种GC算法采用的是复制算法
-
原理:(To区被填满 ,会将所有对象移动到年老代中)
-
Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old generation中,也即一旦收集后,Eden是就变成空的了。
-
当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,通过-XX:MaxTenuringThreshold 来设定参数),这些对象就会成为老年代。
-
-XX:MaxTenuringThreshold — 设置对象在新生代中存活的次数
-
-
解释:
-
原理:
-
从根集合(GC Root)开始,通过Tracing从From中找到存活对象,拷贝到To中
-
From,To交换身份,下次内存分配从To开始
-
-
优点:
-
没有标记和清除的过程效率高
-
没有内存碎片
-
-
缺点:
-
浪费了一半的内存,
-
如果对象存活率很高,很耗费性能
-
-
-
-
标记清除
-
老年代一般采用的是标记清除和标记整理的混合实现
-
原理
-
标记:从根集合开始扫描,对存活的对象进行标记
-
清除:扫描整个内存空间,回收未被标记的对象
-
-
劣势
-
会产生内存碎片
-
此算法需要暂停整个应用,两次扫描,效率低
-
-
优势:
-
不会产生额外的空间
-
-
-
标记压缩
-
原理
-
标记:从根集合开始扫描,对存活的对象进行标记
-
压缩:再次扫描,并往一端滑动存活对象
-
在整理压缩阶段,不再对标记的对像做回收,而是通过所有存活对像都向一端移动,然后直接清除边界以外的内存。
-
-
优势:
-
不会产生内存碎片
-
-
劣势:
-
效率也不高
-
-
-
标记清除压缩
-
原理:先标记,在清理,最后进行压缩
-
优势:减少移动对象的成本
-
-
-
小总结
-
采用分代收集算法
-
年轻代因为对象存活率低且对象较多,,复制算法
-
老年的代因为存活率高 标记清除压缩算法
-
-
-