最近在golang的邮件列表中看到了一篇关于GC如何处理 unsafe.Pointer
的讨论,觉得应当记录一下。
问题1:如果一个对象只被 unsafe.Pointer
所指向,那么这个对象会被回收么?
回答1:不会。如果 unsafe.Pointer
指向了一个对象,那么 go 的GC会知道有这个对象,并且不会释放这个对象的内存。
但是注意,有一个例外:如果这个对象的内存是在go外被分配的(比如 C.malloc
),那么以上的规则不生效。
问题2:如果这个对象内部也有一些指针,那么GC会如何处理这些指针?
回答2:如果这个对象是在go内部分配的,那么GC也会遍历这些指针(也就是不会被释放)。
问题3:如果在以上两个问题中,对象都不会被释放,那么GC是怎么处理的? unsafe.Pointer
会存对象的类型信息么?
回答3:不会存类型信息,但是如果对象是在go中申请的,那么在对应的内存中是会存有类型信息的;如果没有类型信息,那么GC会采用非常保守的策略:遍历整个对象,只要其中有8bit的值是合法的内存地址(在栈范围内,或者在堆上),就认为是指针,不会进行回收。
问题4:有没有一种情况 unsafe.Pointer
会变成非法的(野指针)?
回答4:在go中,只要 unsafe.Pointer
有一刻是合法的,并且它的值没有修改,那么go会保证它在整个程序的生命周期中都是合法的。在 unsafe.Pointer
和 unsafe.Pointer
间的赋值一定是安全的,但是间接的赋值(比如同过uintptr)可能是非法的,因为uintptr不被认为持有了对象。
go会忽视所有非go分配的对象(比如C.malloc),所以如果在C中有一个指针指向的地址包含了go的对象,那么必须保证这个指针在go中也被一个对象存储下来。
以上所述就是小编给大家介绍的《golang的GC如何处理unsafe.Pointer?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript & jQuery
David Sawyer McFarland / O Reilly / 2011-10-28 / USD 39.99
You don't need programming experience to add interactive and visual effects to your web pages with JavaScript. This Missing Manual shows you how the jQuery library makes JavaScript programming fun, ea......一起来看看 《JavaScript & jQuery》 这本书的介绍吧!