On Sat, Oct 22, 2016 at 2:01 AM, T L <tapir....@gmail.com> wrote:
>
> On Saturday, October 22, 2016 at 4:57:52 PM UTC+8, T L wrote:
>>
>>
>> The string struct used internally is
>>
>> type stringStruct struct {
>>     str unsafe.Pointer
>>     len int
>> }
>>
>> When following f function is called and s is cleared,
>> how do go runtime knows the starting memory address of the old s.str is
>> "a" instead of "c"?
>
>
> I mean how do go runtime knows "abcdefg" instead of "cde" should be
> released.

The garbage collector works in terms of allocated memory blocks.  If
there is a pointer into the memory block, it is retained.  If there
are no remaining pointers to the block, it is released.  The fact that
the string points into the middle of the block only matters in that it
causes the block to be retained.  Where the string points has no
effect on what is released when there are no remaining pointers to the
block.

Note that this does mean that in the current GC implementation a
pointer into the middle of a string will cause the entire string to be
retained, even though if there are no pointers to other parts of the
string then there is no way to use that memory.  In other words,
taking a small slice of a large string will cause the large string to
remain in memory as long as the small slice is live.  I'm not aware of
any current plans to fix this (and I don't even know how it could be
fixed without significantly decreasing throughput).  It's hard to know
how big a problem this is, as people are aware of it and write their
programs to avoid it.  This is https://golang.org/issue/9618.

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