mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[Bug #18929] Fix heap creation thrashing in GC
Before this commit, if we don't have enough slots after sweeping but had pages on the tomb heap, then the GC would frequently allocate and deallocate pages. This is because after sweeping it would set allocatable pages (since there were not enough slots) but free the pages on the tomb heap. This commit reuses pages on the tomb heap if there's not enough slots after sweeping.
This commit is contained in:
parent
804b073573
commit
cdbb9b8555
Notes:
git
2022-07-21 23:46:53 +09:00
1 changed files with 13 additions and 0 deletions
13
gc.c
13
gc.c
|
@ -5810,6 +5810,19 @@ gc_sweep_finish_size_pool(rb_objspace_t *objspace, rb_size_pool_t *size_pool)
|
|||
min_free_slots = gc_params.heap_init_slots;
|
||||
}
|
||||
|
||||
/* If we don't have enough slots and we have pages on the tomb heap, move
|
||||
* pages from the tomb heap to the eden heap. This may prevent page
|
||||
* creation thrashing (frequently allocating and deallocting pages) and
|
||||
* GC thrashing (running GC more frequently than required). */
|
||||
struct heap_page *resurrected_page;
|
||||
while (swept_slots < min_free_slots &&
|
||||
(resurrected_page = heap_page_resurrect(objspace, size_pool))) {
|
||||
swept_slots += resurrected_page->free_slots;
|
||||
|
||||
heap_add_page(objspace, size_pool, heap, resurrected_page);
|
||||
heap_add_freepage(heap, resurrected_page);
|
||||
}
|
||||
|
||||
if (swept_slots < min_free_slots) {
|
||||
bool grow_heap = is_full_marking(objspace);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue