G1的年青代由eden region 和 survivor region 两部门构成,新建的工具(除了巨型工具)大部门都在eden region中分派内存,假如分派失败,说明eden region已经被全部占满,这时会触发一次young gc,接纳eden region的垃圾工具,释放空间,满意当前的分派需求。
小工具
G1默认启用了UseTLAB
优化,建设工具(小工具)时,优先从TLAB中分派内存,假如分派失败,说明当前TLAB的剩余空间不满意分派需求,则挪用allocate_new_tlab
要领从头申请一块TLAB空间,之前都是从eden区分派,G1需要从eden region中分派,不外也有大概TLAB的剩余空间还较量大,JVM不想就这么挥霍掉这些内存,就会从eden region中分派内存。
allocate_new_tlab
要领的实现:
这只是TLAB申请进口,真正的实现位于attempt_allocation
要领中,优先实验在当前的region分派。
attempt_allocation
要领的实现:
个中_mutator_alloc_region
在实现上担任自G1Allocregion
,内部持有一个引用_alloc_region
,指向当前正活泼的eden region,可以当作是该region的打点器,其attempt_allocation
要领认真在该region中分派内存。
G1Allocregion::attempt_allocation
要领的实现:
每个region内部打点着一块逻辑持续的地点空间,在并发环境下,回收指针碰撞方法举办内存分派,制止了效率低下的加锁操纵。
指针碰撞实现道理:
假如上述分派行动返回NULL,说明当前该region空间不敷,导致分派失败,继而挪用attempt_allocation_slow
要领,执行慢路径举办分派。
慢路径的实现如下:
慢路径的逻辑主要是申请一个新的region,不外大概存在多个线程同时申请,所以在申请行动产生之前,需要举办加锁操纵,由于挪用层级较量多,临时忽略中间步调,阐明最终实现。
G1CollectedHeap::new_mutator_alloc_region
要领实现:
个中force
为false,is_young_list_full
要领判定当前young_list中的region数是否已经高出阈值_young_list_target_length
,实现如下:
bool is_young_list_full() { uint young_list_length = _g1->young_list()->length(); uint young_list_target_length = _young_list_target_length; return young_list_length >= young_list_target_length; }
个中_young_list_target_length
,在gc之后会从头计较获得一个公道的值,假如当前young region的数量还没到达阈值,则可以通过new_region()
要领获取一个新的region,昆山软件开发,不然返回NULL。