[PATCH 2/3] Free large chunks in ggc
Fri Oct 21 18:48:00 GMT 2011
> > diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c
> > index ba88e3f..eb0eeef 100644
> > --- a/gcc/ggc-page.c
> > +++ b/gcc/ggc-page.c
> > @@ -972,6 +972,54 @@ release_pages (void)
> > Â page_entry *p, *start_p;
> > Â char *start;
> > Â size_t len;
> > + Â size_t mapped_len;
> > + Â page_entry *next, *prev, *newprev;
> > + Â size_t free_unit = PARAM_VALUE (GGC_FREE_UNIT) * G.pagesize;
> > +
> > + Â /* First free larger continuous areas to the OS.
> > + Â Â This allows other allocators to grab these areas if needed.
> > + Â Â This is only done on larger chunks to avoid fragmentation.
> > + Â Â This does not always work because the free_pages list is only
> > + Â Â sorted over a single GC cycle. */
> But release_pages is only called from ggc_collect, or what do you
If there was a spike in GC usage and we end up with lots of free
space in the free list afterward we free it back on the next GC cycle.
Then if there's a malloc or other allocator later it can grab
the address space we freed.
That was done to address your earlier concern.
This will only happen on ggc_collect of course.
So one difference from before the madvise patch is that different
generations of free pages can accumulate in the freelist. Before madvise
the freelist would never contain more than one generation.
Normally it's sorted by address due to the way GC works, but there's no
attempt to keep the sort order over multiple generations.
The "free in batch" heuristic requires sorting, so it will only
work if all the pages are freed in a single gc cycle.
I considered sorting, but it seemed to be too slow.
I can expand the comment on that.
> mean with the above? Would the hitrate using the quire size increase
> if we change how we allocate from the freelist or is it real fragmentation
> that causes it?
Not sure really about the hitrate. I haven't measured it. If hitrate
was a concern the free list should be probably split into an array.
I'm sure there are lots of other tunings that could be done on the GC,
but probably not by me for now :)
> I'm a bit hesitant to approve the new param, I'd be ok if we just hard-code
> quire-size / 2.
Ok replacing it with a hardcoded value.
More information about the Gcc-patches