初级会员
  • 第 19539 位会员
  • Leigg
  • 2018-06-20 17:56:41
  • Offline
  • 40 6

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • mysql打错了。
  • 不过我看github源码已经处理了。
  • 代码有个优化点: ``` func main() { servSocketObj, err := socketmod.Listen("127.0.0.1", 8080) if err != nil { log.Println("Failed to create Socket:", err) os.Exit(1) } defer servSocketObj.Close() // <--------- 关闭server的fd监听,否则即使程序退出,资源也不能马上释放掉,下次启动会报错:端口在使用中... --- snip --- } ``` 这个问题不是必现的~
  • https://gist.github.com/suapapa/d598d99360497252433af430902bb49e
  • 回答问题:没有办法立即释放slice占用的内存。因为go的GC没有使用引用计数的机制,所以即使tmp=nil也是不行的。 如何优化:我们进入到这个场景中来,这里有一个API,每次请求它时都要创建一个slice,并往里面存放可预估长度的大量的数据。这些数据是一次性的,用完丢弃。但是每次请求时所需的slice空间基本是相等的。 所以,这里我们需要构建一个临时的内存池,即1个可复用的slice。上代码 ``` package main import ( "net/http" "testing" ) var tmp = make([]int, 0, 32*1000000) func f() { println("enter...") for i := 0; i < 32*1000000; i++ { tmp = append(tmp, i) } tmp = tmp[:0] println("done") } func ff(w http.ResponseWriter, r *http.Request) { f() } func TestSlice(t *testing.T) { http.HandleFunc("/x", ff) panic(http.ListenAndServe(":1001", nil)) } ``` 这样就可以使内存占用稳定在一个指标;避免了每请求1次,内存占用就累加1次,从而造成严重的内存泄露事件。