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::ConcurrentMarkSweepCMS 的old区 ConcurrentMarkSweepGeneration
Generation::ASConcurrentMarkSweep使用CMS,并且UseAdaptiveSizePolicy,用于old区ASConcurrentMarkSweepGeneration

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值