Thanks for your patient and wonderful reply. 

在 2017年5月16日星期二 UTC+8下午10:06:25,Ian Lance Taylor写道:
>
> On Tue, May 16, 2017 at 2:01 AM,  <canji...@qq.com <javascript:>> 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.

Reply via email to