欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

就会从eden r 昆山软件开发 egion中分配内存

点击: 次  来源:宝鼎软件 时间:2018-01-25

原文出处: 占小狼

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要领的实现:

就会从eden r 昆山软件开拓 egion中分派内存

这只是TLAB申请进口,真正的实现位于attempt_allocation要领中,优先实验在当前的region分派。

attempt_allocation要领的实现:

就会从eden r 昆山软件开拓 egion中分派内存

个中_mutator_alloc_region在实现上担任自G1Allocregion,内部持有一个引用_alloc_region,指向当前正活泼的eden region,可以当作是该region的打点器,其attempt_allocation要领认真在该region中分派内存。

G1Allocregion::attempt_allocation要领的实现:

就会从eden r 昆山软件开拓 egion中分派内存

每个region内部打点着一块逻辑持续的地点空间,在并发环境下,回收指针碰撞方法举办内存分派,制止了效率低下的加锁操纵。

指针碰撞实现道理:

就会从eden r 昆山软件开拓 egion中分派内存

假如上述分派行动返回NULL,说明当前该region空间不敷,导致分派失败,继而挪用attempt_allocation_slow要领,执行慢路径举办分派。

慢路径的实现如下:

就会从eden r 昆山软件开拓 egion中分派内存

慢路径的逻辑主要是申请一个新的region,不外大概存在多个线程同时申请,所以在申请行动产生之前,需要举办加锁操纵,由于挪用层级较量多,临时忽略中间步调,阐明最终实现。

G1CollectedHeap::new_mutator_alloc_region要领实现:

就会从eden r 昆山软件开拓 egion中分派内存

个中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。

就会从eden r 昆山软件开拓 egion中分派内存