为什么我的Golang服务器似乎有持久的内存使用?

时间:2017-07-18 21:01:58

标签: go concurrency

希望有人可以清除这一点。我正在编写一个递归爬虫,完成后会返回一个JSON字符串。起初,我认为这是我在主项目中的代码,因此我创建了一个简单的程序来隔离和说明问题。

执行以下代码时,它会在端口8080上启动服务器,该端口在我的活动监视器中委派1.1MB的RAM。到目前为止一切都还不错..

当您卷曲该地址时,即curl http://127.0.0.1:8080,处理程序通过调用给定域2000次来执行。完成go例程后,它会发回一个预设响应。但是,活动监视器现在读取29.9MB!?它不应该再回到1.1MB因为它不再运行了吗?这一直让我发疯,任何帮助都会非常感激。

这是虚拟程序:

package main

import (
 "fmt"
 "log"
 "net/http"
 "sync"
)

func main() {

log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    wg := &sync.WaitGroup{}

    for i := 0; i < 2000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            r, err := http.Get("http://theswellcompany.com")
            if err == nil {
                fmt.Println(r.StatusCode)
                err := r.Body.Close()
                if err != nil {
                    // do nothing
                }
            }
        }()
    }
    wg.Wait()
    w.Header().Set("Content-Type", "test/html; charset=UTF-8")
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, string("DONE, but if it's done, WHY does the actvity monitor on my mac still read 40MB??"))
})

log.Fatal(http.ListenAndServe(":8080", nil))
}

0 个答案:

没有答案