Close()调用和垃圾收集器
在 Go 中,使用网络连接等资源的接口通常具有Close()处理这些资源的方法。
现在我想知道如果实现接口的关联结构在没有Close被调用的情况下被垃圾收集会发生什么。操作系统会保持网络连接/文件描述符/任何打开吗?垃圾收集器会做些什么,还是会阻止它接触该结构?
IE
conn, _ := net.DialTCP(network, laddr, raddr)
// do stuff, then
conn = nil
// forgot to invoke `Close()`!!
// what happens now?
回答
这样可关闭的资源可能有建立终结runtime.SetFinalizer,例如netFD的TCPListener:
runtime.SetFinalizer(fd, (*netFD).Close)
这不应成为省略调用Close()空闲资源的原因,也因为不能保证调用终结器或在以下情况下:
终结器计划在程序无法再到达 obj 指向的对象后的某个任意时间运行。有没有保证是终结将在程序退出前运行,所以通常他们只释放一个长期运行的程序中与对象关联的非内存资源非常有用。
调用Close()以确保资源已释放。
有关的:
- 默认情况下,哪些对象在 Go 中最终确定,它有哪些陷阱?
- 此外,垃圾收集器根据 Go 内存使用情况来调整自己的速度——而不是内核资源。因此,如果您_是_ 依赖终结器来关闭连接,则很可能在收集器决定再次运行之前用完文件描述符。