《JVM G1源码分析和调优》 —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;
}
- 点赞
- 收藏
- 关注作者
评论(0)