JAVA内存管理(六)HotSpot中的垃圾收集之串行收集器

雪域幽狐 2013-12-18 20:46 阅读:6466


本系列文章由作者@hunter129翻译,转载请注明出处。

每个收集器都分为4个方面介绍,1.年轻代的收集算法,2.年老代的收集算法,3.何时使用,4.如何选择

下面是正文:

串行收集器(Serial Collector)
在串行收集器中,年轻代和年老代的收集都是串行的(只使用一个CPU),并且使用停止一切的模式。就是说收集发生时会挂起应用程序。

    串行收集器的年轻代收集    
     图3演示了在年轻代使用串行收集器的操作。在伊甸区(Eden)存活的对象除了那些太大而不合适放入的对象都要复制到在图中标记为“To”的最初是空闲状态的生还者区。那些太大的对象直接复制到年老代。另一个使用中的生还者区(标记为From)中的对象中,较为年轻的对象也复制到标记为To的生还者区中,较为年老的则复制到年老代。注意:如果“To”的区域满了,从Eden区或From区存活的对象就不再复制到To了,而是直接晋升而不管这些对象在年轻的的垃圾收集中存活了几次。复制完成后,根据定义,不需要检查,任何留在Eden区或From区的对象都不是存活的。(这些垃圾对象在图中标记为X,但真实的收集器不会检查或标记这些对象。)


图3 年轻代的串行收集


    年轻代的收集完成后,Eden区和以前使用的生还者区都被置空,只有之前空闲的生还者区保存活着的对象。这时,生还者区交换了角色。如图4。


图4 年轻代收集完成之后
  
  
    串行收集器的年老代收集    
    串行收集器在年老代和持久代使用标记-清扫-压缩(mark-sweep-compact)算法。标记阶段,收集器识别哪些对象仍然活着。清扫阶段“扫荡”整个代,识别垃圾。之后,收集器执行平移压缩(sliding compaction),将存活的对象平移到代的前端(持久代类似),相应的在尾部留下一整块连续的空闲空间。如图5。压缩后,以后的分配就可以在年老代和持久代使用空闲指针(bump-the-pointer)技术。(译注:上一篇文章的快速分配部分有介绍。)

图5 年老代的压缩
      

    何时使用串行收集器    
    串行收集器作为一种选择,在那些运行在客户端环境(client-style machines)的对短暂停没有要求的应用程序用中大量使用。
    串行收集器是大多数客户端式(client-style machines)机器上运行的应用程序的选择,这些应用对短暂停没有要求。在今天的硬件上,串行收集器可以有效的管理许多拥有64M堆内存的不平凡的应用程序,并且拥有相对短的在最坏情况下小于半秒的全收集表现。
    
    选择串行收集    
    在第五章描述中,J2SE 5.0把串行收集器自动选为非服务器级机器(not server-class machines)的默认垃圾收集器。在其他机器上,串行收集器可以用命令行参数 -XX:+UseSerialGC 明确指定。

0条评论

登陆后可评论