JVMGC机制

来源:互联网 发布:怎么下载网站的数据库 编辑:程序博客网 时间:2024/05/21 06:13
GC就是找到不用的对象,回收对象,释放内存。

名词解释:
minor gc:年轻代回收
major gc/full gc:年老代回收
当进行年老代回收时,往往伴随至少一次年轻代回收。但在PS回收器时,则会选择只进行major gc。

对象的移动过程:
初始在eden区分配,当进行一次年轻代gc后,放入存活区。当在存活区来回复制N次(可配置),进入年老代。大对象也会直接放入年老代(可配置)。当存活区放不下时,也会通过担保机制将存活区全部对象放入年老代。当存活区相同年龄的对象大小总和大于存活区的一半时,会将大于等于这个年龄的对象放到年老代。

什么时候触发:
年轻代:
1、当eden区新对象无法申请到足够内存时,进行年轻代回收。将剩余的对象复制到to存活区。并将上次在from存活区的对象也复制到to存活区。当存活区放不下时,会通过担保机制直接放到老年代。然后在将新对象放入eden区。
2、当存活区放满无法申请更多内存时,也会触发minor gc,会将所有存活区的对象放入年老代。

年老代:
1、当无法申请足够大内存时触发年老代回收。也可能是大对象无法申请到连续内存也会触发。
2、如果使用CMS,当达到配置的比例时,会触发full gc。默认92%。
3、当进行minor gc之前存活对象的内存空间大于年老代剩余连续内存的大小并且剩余空间小于历史minor gc放入老年代内存大小时进行full gc。

回收哪些对象:
1、引用链找不到的对象。
2、弱引用对象
3、内存不足时会回收软引用对象。
回收时对象可以自救,执行finalize方法,将自己被别的对象引用。


标记算法:
1、引用计数法,会引起互相引用导致无法回收
2、GC Root:将所有的引用定为GC Root,如果对象有到GC Root引用链,则标记对象为可用。回收时删除未被标记的对象。可作为GC Roots的有:1、线程栈中的引用;2、方法区中的常量引用;3、方法区中静态类属性引用;4、本地方法栈中的native引用。

垃圾回收算法:
标记-清除:标记可用对象后,清除不可用对象。
缺点:容易产生内存碎片。
适用场景:对象存活率大的区域。
标记-整理:标记可用对象后,将可用对象复制到内存的另一端,清除之前一端的数据。
缺点:如果存活率高,则需要时间长
适用场景:存活率大的区域,可适当配合标记清除。
标记-复制:标记可用对象后,将可用对象复制到另一块内存区域。
缺点:浪费内存,需要有一块或多块空内存。
适用场景:对象存活率低的区域。
分代回收算法:组合上面的算法。为不同内存代选择不同回收算法。

垃圾回收器:
回收器就是垃圾算法的实现。所有的垃圾回收器都会产生STW(stop the world),CMS垃圾回收器在初始标记和重新标记时会STW。
年轻代:都采用标记复制算法。
serial:串行垃圾回收,单线程回收,适合单核机器、client模式。
parallel:并行垃圾回收,多线程回收,适合多cpu机器,cms老年代回收器默认的年轻代回收器。 
parallel Scavenge:并行垃圾回收器,为提高吞吐量考虑。和parallel不同的是可以设置吞吐量比例,并可以自适应内存分配。 Server 模式默认的年轻代GC

年老代:都采用
serial old:串行垃圾回收器,默认的client模式下的老年代垃圾回收。
parallel old:并行垃圾回收器。jdk6以后加入,为配合Parallel Scavenge并行年轻代提高吞吐量提供。 ParOld
CMS:并发垃圾回收器。可以说现在是CMS的天下。分为4个阶段:
1、初始标记:标记所有能从GC root引用链直接找到的对象,STW发生。并行处理。
2、并发标记:和用户线程并发进行。深入引用链查找存活对象。
3、重新标记:标记之前由于并发用户线程导致的对象地址变更。
4、并发清理:和用户进程并发进行。会分配(cpu+3)/4个cpu处理清除内存。
因为使用标记清除算法,所以会有内存碎片,默认开启了当CMS顶不住时,开启整理碎片,但整理碎片时会发生STW。还可以配置几次cms gc后进行内存整理,默认值是0。
因和用户线程并发执行,所以在清理过程中会继续出现垃圾内存,当次CMS是无法回收的,只能等下一次。

CMS因为和用户并发执行,所以不可能等内存100%以后再回收,系统会预留一部分内存用于存放用户线程产生的年老代垃圾。默认是68%,可以通过参数设置。在jdk6中,默认是92%。当CMS运行时,内存无法满足用户需要,会触发Concurrent Mode Failure错误,jvm会启用serial old来继续回收。


垃圾回收日志解读:
5.617(时间戳): [GC(Young GC) 5.617(时间戳): [ParNew(使用ParNew作为年轻代的垃圾回收期): 43296K(年轻代垃圾回收前的大小)->7006K(年轻代垃圾回收以后的大小)(47808K)(年轻代的总大小), 0.0136826 secs(回收时间)] 44992K(堆区垃圾回收前的大小)->8702K(堆区垃圾回收后的大小)(252608K)(堆区总大小), 0.0137904 secs(回收时间)] [Times: user=0.03(Young GC用户耗时) sys=0.00(Young GC系统耗时), real=0.02 secs(Young GC实际耗时)]  


某互联网公司
-server -Xmx2g -Xms2g -Xmn256m 
-XX:PermSize=128m -Xss256k 
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:CMSInitiatingOccupancyFraction=70
原创粉丝点击