有没有办法获得使用runtime.SetFinalizer和尚未运行的终结器总数?
我们正在考虑struct在我们的某些产品中添加一个注册的终结器以释放使用的内存malloc,并且该对象可能具有相对较高的分配率.如果我们能够监控终结器的数量,确保它们不会堆积并触发内存不足错误(就像它们倾向于与其他垃圾收集器一样),那将是很好的.
(我知道显式释放会避免这个问题,但我们不能改变现有的代码,它不会调用Close函数或类似的东西.)
小智 4
您可以在创建和最终确定新对象时分别通过递增和递减未导出的包变量来保留这些对象的计数。
例如:
package main
import (
"fmt"
"runtime"
"sync/atomic"
)
var totalObjects int32
func TotalObjects() int32 {
return atomic.LoadInt32(&totalObjects)
}
type Object struct {
p uintptr // C allocated pointer
}
func NewObject() *Object {
o := &Object{
}
// TODO: perform other initializations
atomic.AddInt32(&totalObjects, 1)
runtime.SetFinalizer(o, (*Object).finalizer)
return o
}
func (o *Object) finalizer() {
atomic.AddInt32(&totalObjects, -1)
// TODO: perform finalizations
}
func main() {
fmt.Println("Total objects:", TotalObjects())
for i := 0; i < 100; i++ {
_ = NewObject()
runtime.GC()
}
fmt.Println("Total objects:", TotalObjects())
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/n35QABBICj