zoukankan      html  css  js  c++  java
  • 关于JVM中的两个Survivor区

    在JVM GC的分代机制中,年轻代中有两个Survivor区,为了便于交换,需要保证其中一个为空,这个容易理解,但是为什么需要两个Survivor区,而且很多网上资料中说在特殊情况下,可以配置为多个,并没有说怎么配置,也没有说是什么特殊情况。

    下面是一个小小的可以借鉴的原因,是从http://www.iteye.com/topic/894148看到的:

    1)感觉这是和GC的copying算法相关吧,既然是拷贝,就得有地方做from,有地方做to。
    2)嗯,正是如此。在原始的copying收集算法里,空间被分为两半,叫做semispace。空间分配和回收的过程就是把其中一半用作from来分配空间,当from快满或满足别的一些条件时将可到达的对象复制到to,并将from与to逻辑交换的过程。 
    单纯的copying收集不能很好的应对长时间存活的对象,因为那样的对象每次经历收集的时候都还活着,带来拷贝的开销。出于权衡,HotSpot里目前除G1外都采用相似的方式实现分代式GC,并且在young gen都使用copying收集算法。不过它使用的copying算法是原始算法的变种,留一块较大的区域作为eden,在eden与old gen之间设置semispace来作为缓冲,让“中等寿命”的对象尽量在进入old gen之前被收集掉。这就是HotSpot的survivor spaces了。 
    嗯虽说是相似的方式,不过HotSpot里Parallel Scavenge与另外几种GC在实现上有点不同。其它的几种是共用了一套从JDK 1.4开始用的分代式GC框架,Parallel Scavenge则是自己实现了类似的功能而没用那套框架

    但这仍然不能解释为什么只需要两个Survivor区。个人感觉是为了提高效率,只有两个空间来相互交换,当有三个空间时,根据已存的算法,此时就有两个空间空着啦,木有任何意义,但是可以改进算法啊,此时又陷入迷惑当中,寻求真实原因,求大牛解释。

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/tianzibobo/p/3682374.html
Copyright © 2011-2022 走看看