2008年9月6日星期六

JVM_006:分代垃圾收集算法(摘录+整理)

1. 年轻代、年老代、永久代
分代思想很类似于环境保护中的垃圾分类处理,只不过它区分的原则是对象的生命周期长短,分为3个代年轻代、年老代、永久代,不同的代采用不同的收集算法。永久代一般固定大小为64M,而我们常说的Heap = 年轻代 + 年老代。Heap大小一定情况下,增大年轻代将会减小年老代。1.1 年轻代 Young
这里的对象生命周期非常短,因此采用了复制算法收集垃圾。
复制算法优点是只访问活跃对象,缺点是复制成本高。
但因为年轻代只有少量的对象能熬到垃圾收集,因此只需少量的复制。
优化建议:将垃圾收集进行的时间间隔尽量控制在大部分对象死亡之后,最大限度的减少复制工作。

年轻代中又分为3个区域,1个Eden
,所有新建对象都创建在该区;2个Survivor区,用来实施复制算法。
每次复制就是将Eden和第1块Survior中的活的对象复制到第2块
Survior中,然后清空Eden与第一块Survior。

年轻代有关的参数如下:
(1)-XX:NewRatio=
(2)-XX:SurvivorRatio=
(3)-XX:NewSize=
(4)-XX:MaxNewSize=
(5)-XX:+UseParNewGC
(6)-XX:TargetSurvivorRatio

(7)-Xmn<size>

1.2 年老代 Tenured
年轻代的对象如果能够挺过数次收集,就会进入年老代。
年老代使用标记整理算法,每次遍历区域内所有对象。
因为
年老代中的对象都没那么容易死的,采用复制算法就要反复的复制活的对象,很不合算。代有关的参数如下:
(1)-XX:MaxTenuringThreshold=
(2)-XX:+PrintTenuringDistribution
(3)-XX:+UseConcMarkSweepGC

1.3 永久代
装载Class信息等基础数据,服务器Weblogic Server以及Spring,Hibernate这类喜欢AOP动态生成类的框架需要更多的永久代内存。
默认64M。
该值如果满了之后会引起Full GC或Out of Memory。永久代有关的参数如下:
(1)-XX:PermSize=
(2)-XX:MaxPermSize=
2. 不同的代选择不同的垃圾收集算法
2.1
串行收集器(Serial Collector)
(1)-XX:+UseSerialGC:年轻代串行复制,年老代串行标记整理。

2.2 并行收集器(Throughput Collector),吞吐量优先。
(1)-XX:+UseParallelGC :设置-server时默认选用的收集器。收集策略如下:
年轻代暂停应用程序,多个垃圾收集线程并行的复制收集,线程数默认为CPU个数。
年老代暂停应用程序,与串行收集器一样,单垃圾收集线程标记整理。
(2)-XX:ParallelGCThreads=:CPU很多时,可以设置实际需要的线程数。
(3)-XX:MaxGCPauseMillis=:设置并行收集年轻代垃圾的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
(4)-XX:GCTimeRatio=:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)。可以看出,在单个CPU时,并行收集器并没有体现出优势(多个线程分享一个CPU <= 一个线程独占一个CPU),只有在2个以上的CPU时,并行收集器才会优于串行收集器。
【吞吐率】:未用于垃圾收集上的时间占运行总时间的百分比。
吞吐率越高,应用程序运行得越快。通常服务器程序都要求有较高的吞吐率。并行收集器侧重于吞吐量,对暂停时间要求较为宽松,适用于后台处理,科学计算。
2.3 并发收集器(Concurrent Low Pause Collector-CMS),暂停时间优先。
(1)-XX:+UseConcMarkSweepGC:收集策略如下:
年轻代暂停应用程序,多个垃圾收集线程并行的复制收集,线程数默认为CPU个数。
年老代只有两次短暂停,其他时间收集线程(占用一个CPU)与应用程序并发运行。
并发收集一开始会很短暂的停止一次所有线程来开始初始标记根对象,然后标记线程与应用线程一起并发运行,最后又很短的暂停一次,多线程并行的重新标记之前可能因为并发而漏掉的对象,然后就开始与应用程序并发的清除过程。
可见,最长的两个遍历过程都是与应用程序并发执行的,比以前的串行算法改进太多太多了!
(2)-XX:CMSInitiatingOccupancyFraction=:串行标记清除是等年老代满了再开始收集的,而并发收集因为要与应用程序一起运行,如果满了才收集,应用程序就无内存可用,所以系统默认68%满的时候就开始收集。内存已设得较大,吃内存又没有这么快的时候,可以用恰当增大该比率。【暂停时间】:指垃圾收集器运行时,应用程序停止响应的时间。
通常桌面GUI 程序都要求程序快速作出响应。适用于对暂停时间要求较高的应用,如Web服务器/应用服务器。

3. minor 收集和major 收集
每个代满了之后都会触发收集(并发收集器默认在年老代68%的时候触发收集),GC对年轻代扫描和回收的频率较高,对年老代的扫描和回收的频率则要低很多。
只对年轻代的回收称为minor 收集;同时对年轻代和年老代的回收称为major 收集。

没有评论: