在前面的文章中曾提到了在java虚拟机启动的时候会对G1,CMS, SerialGC定义不同的heap的类,并且定义不同的policy。
CollectorPolicy
CollectorPolicy主要是用于根据虚拟机启动的参数分配heap的大小,和将heap堆分不同的区的大小(比如yong区和Old区),并且对不同的区定义不同的generation的规范。
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的方式 |
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 |