《JVM G1源码分析和调优》 —3.3.2 最后的分配尝试

举报
华章计算机 发表于 2019/12/20 13:47:58 2019/12/20
【摘要】 本节书摘来自华章计算机《JVM G1源码分析和调优》 一书中第3章,第3.3.2节,作者是彭成寒。

3.3.2 最后的分配尝试

先尝试分配一下,因为并发之后可能可以分配:

尝试扩展新的分区,成功则返回。

不成功进行Full GC,但是不回收软引用,再次分配成功则返回。

不成功进行Full GC,回收软引用,最后一次分配成功则返回;不成功返回NULL,即分配失败。

最后尝试分配代码如下所示:

hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp

 

G1CollectedHeap::satisfy_failed_allocation(size_t word_size,

                                           AllocationContext_t context,

                                           bool* succeeded) {

  *succeeded = true;

  // 执行GC前尝试再分配一次

  HeapWord* result =   attempt_allocation_at_safepoint(…);

  if (result != NULL)     return result;

 

  // 尝试扩展Heap Region

  result = expand_and_allocate(word_size, context);

  if (result != NULL)  return result;

 

  // 扩展不成功,进行Full GC,但是不回收软引用

  bool gc_succeeded = do_collection(false, /* explicit_gc */

                                    false, /* clear_all_soft_refs */

                                    word_size);

  if (!gc_succeeded)    return NULL;

 

  // 再次尝试分配

  result = attempt_allocation_at_safepoint(…);

  if (result != NULL)    return result;

 

  // 进行Full GC,回收软引用

  gc_succeeded = do_collection(false, /* explicit_gc */

                               true,  /* clear_all_soft_refs */

                               word_size);

  if (!gc_succeeded)     return NULL;

 

  // 最后一次尝试分配

  result = attempt_allocation_at_safepoint(…);

  if (result != NULL)    return result;

 

  return NULL;

}


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。