diff --git a/src/coreclr/src/gc/gc.cpp b/src/coreclr/src/gc/gc.cpp index 158d0ccdceb3e..542da1e032765 100644 --- a/src/coreclr/src/gc/gc.cpp +++ b/src/coreclr/src/gc/gc.cpp @@ -34004,7 +34004,7 @@ void gc_heap::background_sweep() //block concurrent allocation for large objects dprintf (3, ("lh state: planning")); - for (int i = 0; i < total_generation_count; i++) + for (int i = 0; i <= max_generation; i++) { generation* gen_to_reset = generation_of (i); generation_allocator (gen_to_reset)->clear(); @@ -34128,6 +34128,19 @@ void gc_heap::background_sweep() start_seg = gen_start_seg; prev_seg = NULL; align_const = get_alignment_constant (FALSE); + + // UOH allocations are possible while sweeping SOH, so + // we defer clearing UOH free lists until we start sweeping them + generation_allocator (gen)->clear(); + generation_free_list_space (gen) = 0; + generation_free_obj_space (gen) = 0; + generation_free_list_allocated (gen) = 0; + generation_end_seg_allocated (gen) = 0; + generation_condemned_allocated (gen) = 0; + generation_sweep_allocated (gen) = 0; + generation_allocation_pointer (gen)= 0; + generation_allocation_limit (gen) = 0; + generation_allocation_segment (gen) = heap_segment_rw (generation_start_segment (gen)); } PREFIX_ASSUME(start_seg != NULL);