gc 会回收文件吗(os.File)?
会的,可以写一个函数循环open
文件,可以计算出到资源限制open
失败前总共可以打开多少文件。紧接着调用GC
,并再次循环open
文件,如果GC
回收文件,则第二次循环应该和第一次循环打开同样数量的文件。
package main
import (
"fmt"
"os"
"runtime"
)
func allocate() int {
//use this file as target file
_, fileName, _, ok := runtime.Caller(1)
if !ok {
panic("source file not found")
}
fmt.Printf("filename: %s\n", fileName)
count := 0
var files []*os.File
for {
f, err := os.Open(fileName)
if err != nil {
fmt.Printf("successful opens= %d\n", count)
return count
}
count++
files = append(files, f)
}
}
func main() {
allocate()
// runtime.GC()
allocate()
}
无GC
可以看到第二次循环打开的文件数为0:
filename: /home/ubuntu/test/gogc.go
successful opens= 1048569
filename: /home/ubuntu/test/gogc.go
successful opens= 0
添加上GC
后,可以看到第二次和第一次open
的文件数一样:
filename: /home/ubuntu/test/gogc.go
successful opens= 1048569
filename: /home/ubuntu/test/gogc.go
successful opens= 1048569
文档信息
- 本文作者:seamaner
- 本文链接:https://seamaner.github.io/2024/01/19/golang-gc/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)