HotSpot的堆空间分为新生代(YoungGen)和老年代(OldGen,此外还有位于非堆空间的永久代,但在Java8中将移除永久代),新生代又分为Eden区和2个Survivor区(From/To)用以进行复制收集垃圾对象。 2.若虚拟机配置UseG1GC,那么将选择堆类型为G1CollectedHeap,垃圾收集策略将使用专用的G1CollectorPolicy(垃圾优先收集)策略 3.否则,虚拟机将使用GenCollectedHeap(分代收集堆) (2).若虚拟机配置UseConcMarkSweepGC和UseAdaptiveSizePolicy,那么将使用 ASConcurrentMarkSweepPolicy(自适应并发标记-清除)策略,若没有指定UseAdaptiveSizePolicy,虚拟机 将默认使用ConcurrentMarkSweepPolicy(并发标记-清除)策略 (3).若没有进行配置,虚拟机将默认使用MarkSweepPolicy策略 如下表所示: 其中垃圾回收策略类的关系如下图: 4.接下来是相应实现的堆的初始化 5.堆空间初始化完成后,是LP64平台上的指针压缩以及TLAB的相关内容 。 指针压缩的地址计算如下: 若堆寻址空间大于4GB(2^32)但小于32GB时,就必须借助偏移来获得真正的地址(对象是8字节对齐的)。 (1).若heap的地址空间的最大地址大于OopEncodingHeapMax(32GB),则设置基础地址为当前堆的起始地址-页大小,设置偏移为LogMinObjAlignmentInBytes(3),即使用普通的对象指针压缩技术 2.默认新生代使用DefNew实现 3.老年代固定使用MarkSweepCompact实现 enum SomeConstants { max_gens = 10 }; //... private: int _n_gens; Generation* _gens[max_gens];
Read full article from 源码分析:Java堆的创建 - ImportNew
No comments:
Post a Comment