zoukankan      html  css  js  c++  java
  • java垃圾回收那点事(二)不同gc策略的heap分配

    在前面的文章中曾提到了在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
  • 相关阅读:
    图像滤镜艺术---乐高像素拼图特效滤镜的代码实现
    假设你也23
    seajs载入流程图
    android 怎样将主菜单图标改成按安装时间排序
    热力学第一定律的社会学思考
    Django创建数据表
    KeyPress 和KeyDown 、KeyPress之间的区别
    Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)
    Delphi中的窗体创建与销毁
    Delphi ADOQuery连接数据库的查询、插入、删除、修改
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310599.html
Copyright © 2011-2022 走看看