This is a really great response. I appreciated the high-level overview in
one place like this, and I feel like I learned something. Thanks for
writing it up, Ian.

On Tue, May 16, 2017 at 10:05 AM, Ian Lance Taylor <i...@golang.org> wrote:

> On Tue, May 16, 2017 at 2:01 AM,  <canjian...@qq.com> wrote:
> >
> > Generational and Compact gc have already been thought best practice. But
> > golang doesn't adopt it. Who can tell me the reason?
>
> This has been discussed in the past.
>
> Ignoring details, the basic advantages of a compacting GC are 1) avoid
> fragmentation, and 2) permit the use of a simple and efficient bump
> allocator.  However, modern memory allocation algorithms, like the
> tcmalloc-based approach used by the Go runtime, have essentially no
> fragmentation issues.  And while a bump allocator can be simple and
> efficient for a single-threaded program, in a multi-threaded program
> like Go it requires locks.  In general it's likely to be more
> efficient to allocate memory using a set of per-thread caches, and at
> that point you've lost the advantages of a bump allocator.  So I would
> assert that, in general, with many caveats, there is no real advantage
> to using a compacting memory allocator for a multi-threaded program
> today.  I don't mean that there is anything wrong with using a
> compacting allocator, I'm just claiming that it doesn't bring any big
> advantage over a non-compacting one.
>
> Now let's consider a generational GC.  The point of a generational GC
> relies on the generational hypothesis: that most values allocated in a
> program are quickly unused, so there is an advantage for the GC to
> spend more time looking at recently allocated objects.  Here Go
> differs from many garbage collected languages in that many objects are
> allocated directly on the program stack.  The Go compiler uses escape
> analysis to find objects whose lifetime is known at compile time, and
> allocates them on the stack rather than in garbage collected memory.
> So in general, in Go, compared to other languages, a larger percentage
> of the quickly-unused values that a generational GC looks for are
> never allocated in GC memory in the first place.  So a generational GC
> would likely bring less advantage to Go than it does for other
> languages.
>
> More subtly, the implicit point of most generational GC
> implementations is to reduce the amount of time that a program pauses
> for garbage collection.  By looking at only the youngest generation
> during a pause, the pause is kept short.  However, Go uses a
> concurrent garbage collector, and in Go the pause time is independent
> of the size of the youngest generation, or of any generation.  Go is
> basically assuming that in a multi-threaded program it is better
> overall to spend slightly more total CPU time on GC, by running GC in
> parallel on a different core, rather than to minimize GC time but to
> pause overall program execution for longer.
>
> All that said, generational GC could perhaps still bring significant
> value to Go, by reducing the amount of work the GC has to do even in
> parallel.  It's a hypothesis that needs to be tested.  Current GC work
> in Go is actually looking closely at a related but different
> hypothesis: that Go programs may tend to allocate memory on a
> per-request basis.  This is described at
> https://docs.google.com/document/d/1gCsFxXamW8RRvOe5hECz98Ftk-
> tcRRJcDFANj2VwCB0/view
> .  This is work in progress and it remains to be seen whether it will
> be advantageous in reality.
>
> Ian
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to