JAVA垃圾收集器(二)

上篇文章说了JAVA垃圾收集器的一些算法,这次讲讲JVM中用到的一些垃圾收集器,这些垃圾收集器也是运用这些算法来回收内存的,如下图:

141513122384006

新生代收集器有:Serial、ParNew、Parallel Scavenge

老年代收集器有:CMS、Serial Old Parallel Old

Serial收集器(复制算法)

新生代单线程收集器,使用标记清理算法,且标记、清理都是单线程,优点:运行高效,缺点:界面会产生卡顿的现象

Serial Old收集器(标记-整理)

老年代单线程收集器,Serial老年代收集版本

ParNew收集器(停止-复制算法)

新生代收集器,Serial的多线程版本,并发标记、清理,在多CPU下有比Serial更好的性能

Parallel Scavenge收集器(停止-复制算法)

新生代收集器,也是使用多线程并行收集,但关注的是高吞吐量(最高效率的利用CPU时间),吞吐量=用户线程时间/(用户线程时间+GC线程时间),适用于后台对交互性不高的应用

Parallel Old收集器(停止-复制算法)

老年代收集器,并行收集,吞吐量优先

CMS(Concurrent Mark Sweep)收集器(标记-清除算法)

以获取最短停顿时间为目标的收集器,应用于如(B/S网站),并发收集,占用CPU资源较高。

 对象分配

1)对象优先会在Eden上分配,如果空间不够,则会发起一次Young GC,清除非存活的对象,把存活的对象移动到Survivor中

2)大对象直接进入老年代,大对象指的是需要大量连续内存空间的Java对象,比如很长的字符串或数组,要避免这种大的对象的频繁创建与销毁

3)长期存活的对象将进入老年代,虚拟机会给每个对象定义一个对象年龄计数器,如果对象在Eden出生并经过第一次Young GC后仍然存活将被移动到Survivor中,并对对象年龄设为1,对象在Survivor区中每熬过一次Young GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁)时,就会被晋升到老年代中

4)动态对象年龄判定:虚拟机并不总是要求对象必须到达年龄才能晋升到老年代,如果在Survivor中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入到老年代。

5)触发Full GC:当老年代的剩余空间不足以容纳从Survivor区移动过来的对象,则会触发一次Full GC,另外在触发Young GC时,JVM会进行空间分配担保,如果新生代晋升了平均大小大于老年代的剩余大小也会触发Full GC;调用System.gc()也会触发Full GC,Full GC会对整个堆进行回收,会照成整个应用停止,所以要尽量减少Full GC的次数。

参考资料:

http://www.cnblogs.com/sunniest/p/4575144.html

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>