因为G1的堆布局跟HotSpot VM里其它GC不一样——它只有一组逻辑上的survivor space,而不像其它HotSpot GC一样有两段明确、固定的地址空间用作survivor space——所以用jstat看G1的话肯定是survivor space 0显示0%,survivor space 1显示100%。这个是正常的。
G1在初始化jstat用的计数器的时候就指定了s0永远是0:
- _from_counters = new HSpaceCounters("s0", 1 /* ordinal */,
- pad_capacity(0) /* max_capacity */,
- pad_capacity(0) /* init_capacity */,
- _young_collection_counters);
- _to_counters = new HSpaceCounters("s1", 2 /* ordinal */,
- pad_capacity(overall_reserved()) /* max_capacity */,
- pad_capacity(survivor_space_committed()) /* init_capacity */,
- _young_collection_counters);
-XX:NewRatio=n
-XX:SurvivorRatio=n
这俩参数都是在G1之前就有的,在HotSpot的其它GC里用没问题;G1只是为了兼容以前的使用习惯才遵循这些老旧参数,实际上它们在G1都是不推荐的(跟G1的自动调整有冲突)