From 09d2df162645a1ec98d7ee9b3b66cebada5b7e88 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 18 Jul 2022 14:22:23 +0200 Subject: [PATCH] Compute GC yield as fraction of total heap size --- large-object-space.h | 5 ++++- whippet.h | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/large-object-space.h b/large-object-space.h index cf5be0b29..c708641fb 100644 --- a/large-object-space.h +++ b/large-object-space.h @@ -29,6 +29,7 @@ struct large_object_space { size_t total_pages; size_t free_pages; size_t live_pages_at_last_collection; + size_t pages_freed_by_last_collection; struct address_set from_space; struct address_set to_space; @@ -125,7 +126,9 @@ static void large_object_space_finish_gc(struct large_object_space *space) { address_set_for_each(&space->from_space, large_object_space_reclaim_one, space); address_set_clear(&space->from_space); - space->free_pages = space->total_pages - space->live_pages_at_last_collection; + size_t free_pages = space->total_pages - space->live_pages_at_last_collection; + space->pages_freed_by_last_collection = free_pages - space->free_pages; + space->free_pages = free_pages; pthread_mutex_unlock(&space->lock); } diff --git a/whippet.h b/whippet.h index 56eee50ed..cce3f3090 100644 --- a/whippet.h +++ b/whippet.h @@ -773,6 +773,18 @@ static int maybe_grow_heap(struct heap *heap, enum gc_reason reason) { return 0; } +static double heap_last_gc_yield(struct heap *heap) { + struct mark_space *mark_space = heap_mark_space(heap); + size_t mark_space_yield = mark_space->granules_freed_by_last_collection; + mark_space_yield <<= GRANULE_SIZE_LOG_2; + struct large_object_space *lospace = heap_large_object_space(heap); + size_t lospace_yield = lospace->pages_freed_by_last_collection; + lospace_yield <<= lospace->page_size_log2; + + double yield = mark_space_yield + lospace_yield; + return yield / heap->size; +} + static double heap_fragmentation(struct heap *heap) { struct mark_space *mark_space = heap_mark_space(heap); size_t mark_space_blocks = mark_space->nslabs * NONMETA_BLOCKS_PER_SLAB; @@ -811,9 +823,8 @@ static void collect(struct mutator *mut, enum gc_reason reason) { trace_mutator_roots_with_lock_before_stop(mut); finish_sweeping(mut); wait_for_mutators_to_stop(heap); - double yield = space->granules_freed_by_last_collection * GRANULE_SIZE; + double yield = heap_last_gc_yield(heap); double fragmentation = heap_fragmentation(heap); - yield /= SLAB_SIZE * space->nslabs; fprintf(stderr, "last gc yield: %f; fragmentation: %f\n", yield, fragmentation); trace_mutator_roots_after_stop(heap); trace_global_roots(heap);