我正在嘗試檢測Go打開的文件描述,但沒有故意關閉。換句話說,我試圖使我的代碼“錯誤”,資源泄漏。我的代碼是func hh(w http.ResponseWriter, r *http.Request) { f0, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0755) if err != nil { log.Fatal(err) } // I don't close file fmt.Println(io.ReadAll(f0))}func main() { http.HandleFunc("/req", hh) log.Fatal(http.ListenAndServe(":8080", nil))}我使用shell腳本文件打印出有多少文件描述屬于這個Go程序。FCOUNT=`lsof -p $1 | grep -v " txt " | wc -l`;echo "PID: $1 $FCOUNT" | sort -nk3無論我向此服務器發送多少請求(),MacBook上的數字仍然是10。當然,我檢查并得到相同的答案。curl http://localhost:8080/reqActivity MonitorPS:我的第一個版本的代碼實際上正在使用,并且沒有關閉響應。也有同樣的情況。http.GetBody我的環境: ,macOS Big Sur 11.2.3go version go1.16.2 darwin/amd64有誰知道為什么文件描述號在我認為應該泄漏時保持靜止?我的 shell 腳本有問題嗎?還是Golang在里面做了一些技巧?謝謝!更新問題是我正在檢查命名的進程而不是我的文件夾名稱。Go真的給了我一個額外的程序,看起來像一個守護進程,它不能顯示fd細節。真正的程序清楚地顯示了fd泄漏。盡管如此,我從關于golang的GC的答案和評論中得到了一些知識。gogo我將結束這個問題。
2 回答

郎朗坤
TA貢獻1921條經驗 獲得超9個贊
正如Burak Serdar所指出的那樣,在gc期間關閉打開的文件是可能的。這意味著主題行中提出的問題的答案 - “在某些情況下,Go 會自動關閉文件描述嗎?—是“是”。但在某些情況下,這里正在做很多繁重的工作。
垃圾回收實際發生的時間點通常很難預測(盡管您可以自己故意調用GC代碼)。終結器的運行點甚至更難預測,因為有些工作可能在單獨的goroutine中完成。有關詳細信息,請參閱如何停止 golang gc 并手動觸發它?,并注意 Go 的每個版本可能會更改有關 GC 內部的一些規則(盡管 的操作非常穩定)。GOGC
- 2 回答
- 0 關注
- 175 瀏覽
添加回答
舉報
0/150
提交
取消