Golang GC 文件回收

2024/01/19 eBPF 共 767 字,约 3 分钟

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

文档信息

Search

    Table of Contents