在sun的内存模型中,一般会有这么几个区:
eden区满了之后,会触发一次Young GC,Young GC会将eden区,S0(或S1)释放不掉的对象,放入另外一个空闲的交换区S1(或S0)。即触发一次S0与S1的交换。如果一次Young GC后空闲的交换区不足以放下全部的活的对象,剩余的对象会被直接丢进old区,所以关注每次Young GC后old区内存的增长,以及交换区的使用率至关重要。交换区设置的过小,或者虚拟机动态调整导致交换区长时间过小,都会造成old 区内存的持续增长,直至频繁的Full GC。sun建议,交换区的使用最好不要超过50%。
那如何限制交换区的大小呢,sun提供了如下的参数进行配置:
-XX:SurvivorRatio=6 -XX:-UseAdaptiveSizePolicy
其中 -XX:SurvivorRatio=6 设置eden:survivor的比例为6:1,默认值为8:1,-XX:-UseAdaptiveSizePolicy 禁止jvm对 eden:S0:S1 进行调整