java的GC机制--javaGC机制

GC机制的基本机制是:分代收集
年轻代:
在年轻代中,使用“停止-复制”算法进行清理,将年轻代内存分为两个部分,Eden区较大,Survivor区较小,并且划分为两个相等的部分。每次清理时,将Eden区中和Survivor区中存活的对象复制到另一个Survivor区中,然后将Eden和Survivor区中的对象清除。停止复制算法中,用来复制的两个部分并不总是相等的(传统的停止复制算法两个部分内存相等,在年轻代中采用一个大的Eden区和两个相等的Survivor区来避免这个问题)。
由于绝大部分的对象是短命的,甚至存活不到Survivor中,所以Eden区的比例大,在HotSpot中,默认比例为8:1,分别占年轻代的80:10:10,一次垃圾回收,Eden和Survivor区中存活的比例超过10%,则需要将一部分对象分配到年老代中。
用-XX:SurvivorRatio参数来配置Eden区域Survivor区的容量比值,默认是8,代表Eden:Survivor1:Survivor2=8:1:1.
年老代:
年老代存储的对象比年轻代多得多,而且不乏大对象,对年老区内存进行清理时,如果也使用停止-复制的方式,是相当低效的。一般老年代用的算法是标记-整理算法:标记出仍然存活的对象(存在引用的),将存活的对象向一端移动,以保存内存的连续性。
在发生Minor GC时,虚拟机会检查每次晋升进入年老代的大小是否大于剩余年老代内存空间的大小,如果大于,则出发一次full GC,否则就查看是否设置了-XX:+Handle PromotionFailure(允许担保失败),如果允许,只会进行Minor GC,此时可以容忍内存分配失败;如果不允许,则继续执行full GC(这代表着设置了-XX:+Handle PromotionFailure,触发Minor GC 同时会触发full GC ,不管年老代内存是否足够,所以最好不要这样设置)。
方法区(永久代):永久代的回收有两种:常量池中的常量,无用类的信息,常量的回收很简单,没有引用就可以回收了,类的回收必须保证三点
1、类的所有实例都已被回收;
2、加载类的classloader已经被回收;
3、类对象的class对象没有被引用(即没有通过反射引用该类的地方);
永久代的内存回收不是必须的,可以通过参数设置是否进行内存回收。
     HotSpot提供-Xnoclassgc进行控制
     使用-verbose,-XX:+TraceClassLoading、-XX:+TraceClassUnLoading可以查看类加载和卸载信息
     -verbose、-XX:+TraceClassLoading可以在Product版HotSpot中使用;
     -XX:+TraceClassUnLoading需要fastdebug版HotSpot支持

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值