java垃圾回收那点事(三)不同gc策略的heap分配

在上一篇文章中提到了在java虚拟机启动的时候会对G1,CMS, SerialGC定义不同的heap的类,并且定义不同的policy,但是对UseParallelGC java并没有定义heap的policy,而是直接在ParallelScavengeHeap初始化young和old区,所以下面的policy和generation并不针对UseParallelGC


CollectorPolicy

CollectorPolicy主要是用于根据虚拟机启动的参数分配heap的大小,和将heap堆分不同的区的大小(比如young区和Old区),并且对不同的区定义不同的generation的规范。

设置young区大小

MaxNewSize  最大young区大小,如果设置大小比最小对齐小,设置成最小对齐。如果设置大小大于最大堆大小,使用最大堆大小留一个最小对齐大小。

NewSize     young区大小

NewRatio   设置young区在整个heap的大小的比例

Young区可以设置最大,最小,和初始化的大小

1.设置max heap size 等于 min heap size

young区的最大,最小,初始化大小就是MaxNewSize, 如果没有设置MaxNewSize 那就是你设置的NewSize和NewRatio(算出)两个设置的大小的最大值

2. max 和min不一样

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的方式
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

你可能感兴趣的:(java垃圾回收那点事(三)不同gc策略的heap分配)