在上一篇文章中提到了在java虚拟机启动的时候会对G1,CMS, SerialGC定义不同的heap的类,并且定义不同的policy,但是对UseParallelGC java并没有定义heap的policy,而是直接在ParallelScavengeHeap初始化young和old区,所以下面的policy和generation并不针对UseParallelGC
CollectorPolicy
CollectorPolicy主要是用于根据虚拟机启动的参数分配heap的大小,和将heap堆分不同的区的大小(比如young区和Old区),并且对不同的区定义不同的generation的规范。
MaxNewSize 最大young区大小,如果设置大小比最小对齐小,设置成最小对齐。如果设置大小大于最大堆大小,使用最大堆大小留一个最小对齐大小。
NewSize young区大小
NewRatio 设置young区在整个heap的大小的比例
young区的最大,最小,初始化大小就是MaxNewSize, 如果没有设置MaxNewSize 那就是你设置的NewSize和NewRatio(算出)两个设置的大小的最大值
young区最小的size是NewSize,NewRatio(min heap size),(min heap size减去一个最小对齐) 的最小值
young区初始化size是NewSize,NewRatio(initial heap size),(initial heap size减去一个最小对齐) 的最小值
young区最大的size 是MaxNewSize, NewSize, NewRatio(max heap size), (max heap size减去一个最小对齐) 的最大值
GenerationSpec
主要是根据不同的类型使用不同的Generation的方式,这个类型是由CollectionPolicy在初始化GenerationSpec所指定的
例如MarkSweepPolicy ,在initialize_generations的方法中初始话GenerationSpec
void MarkSweepPolicy::initialize_generations() { initialize_perm_generation(PermGen::MarkSweepCompact); _generations = new GenerationSpecPtr[number_of_generations()]; if (_generations == NULL) vm_exit_during_initialization("Unable to allocate gen spec"); if (UseParNewGC && ParallelGCThreads > 0) { _generations[0] = new GenerationSpec(Generation::ParNew, _initial_gen0_size, _max_gen0_size); } else { _generations[0] = new GenerationSpec(Generation::DefNew, _initial_gen0_size, _max_gen0_size); } _generations[1] = new GenerationSpec(Generation::MarkSweepCompact, _initial_gen1_size, _max_gen1_size); if (_generations[0] == NULL || _generations[1] == NULL) vm_exit_during_initialization("Unable to allocate gen spec"); }
类型 | 条件 | generation的方式 |
Generation::DefNew | 不使用UseParNewGC 或者使用UseParNewGC但设置ParallelGCThreads小于1(用于young区) | DefNewGeneration |
Generation::ParNew | 使用UseParNewGC并且ParallelGCThreads线程数大于1(用于young区) | ParNewGeneration |
Generation::ASParNew | 使用CMS,并且UseAdaptiveSizePolicy用于young区 | ASParNewGeneration |
Generation::MarkSweepCompact | 使用UseSerialGC,用于old区 | TenuredGeneration () |
Generation::ConcurrentMarkSweep | CMS 的old区 | ConcurrentMarkSweepGeneration |
Generation::ASConcurrentMarkSweep | 使用CMS,并且UseAdaptiveSizePolicy,用于old区 | ASConcurrentMarkSweepGeneration |