Go 语言的 HTTP 标准库中的内存泄漏问题?

开发 前端
使用一个go库实现的一个http服务器:

使用一个go库实现的一个http服务器:

  1. package main 
  2.       
  3.     import ( 
  4.         "net/http" 
  5.     ) 
  6.       
  7.     func main() { 
  8.         http.ListenAndServe(":8080", nil) 
  9.     } 

它将使用大约850kb的内存启动.通过你的浏览器向它发送一些请求. 你会观察到它(内存的使用)迅速上升到1mb. 如果你等着,你会发现它从来不会降下来. 现在(使用下面的脚本)用 Apache Bench 动一下它,你会发现内存使用仍然在增长. 一段时间过后它最终会维持在8.2mb左右

. Edit编辑: 看起来它并不会止步于8.2,而它的增长速度会显著减慢。现在它处在9.2的水平,并且仍然在增长.

总之,为什么会发生这样的事情呢?我使用了这段shell脚本一探究竟:

  1. while [ true ] 
  2.     do 
  3.         ab -n 1000 -c 100 http://127.0.0.1:8080/ 
  4.         sleep 1 
  5.     end 

然后尝试获得这个的底线, 我已经尝试过调整设置. 试过使用r.Close = true 来阻止 Keep-Alive. 没有任何东西看起来是起作用的.

当我尝试去判断我正在编写的程序是否存在内存泄露时,我发现了这个问题的来由. 它有大量的http处理器和I/O调用. 检查过后我已经关闭了我所有的数据库链接,我继续观察,仍然会看到内存使用继续上升. 我的程序内存使用会维持在 433 MB 左右.

这里是 Goenv 的输出:

  1. GOARCH="amd64" 
  2.     GOBIN="" 
  3.     GOCHAR="6" 
  4.     GOEXE="" 
  5.     GOHOSTARCH="amd64" 
  6.     GOHOSTOS="darwin" 
  7.     GOOS="darwin" 
  8.     GOPATH="/Users/mark/Documents/Programming/Go" 
  9.     GORACE="" 
  10.     GOROOT="/usr/local/go" 
  11.     GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" 
  12.     TERM="dumb" 
  13.     CC="clang" 
  14.     GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fno-common" 
  15.     CXX="clang++" 
  16.     CGO_ENABLED="1" 

原文链接:http://stackoverflow.com/questions/21080642/memory-leak-in-go-http-standard-library

译文链接:http://www.oschina.net/translate/memory-leak-in-go-http-standard-library

责任编辑:陈四芳 来源: 开源中国编译
相关推荐

2023-11-21 15:46:13

Go内存泄漏

2023-04-02 23:13:07

Go语言bufio

2024-01-30 10:12:00

Java内存泄漏

2024-02-21 08:00:55

WindowsDWM进程

2023-11-01 08:41:24

Go标准库http

2023-12-04 08:46:40

Go标准库

2022-05-26 09:51:50

JavaScrip内存泄漏

2011-06-16 09:28:02

C++内存泄漏

2021-10-18 10:53:26

Go 代码技术

2015-12-21 14:56:12

Go语言Http网络协议

2024-03-22 13:31:00

线程策略线程池

2020-08-17 17:47:30

内存技术测试

2019-01-30 18:24:14

Java内存泄漏编程语言

2015-03-30 11:18:50

内存管理Android

2017-04-10 20:21:39

Go语言源码分析Handler

2021-05-30 19:29:12

内存Go语言

2012-08-15 14:44:53

GC

2020-01-03 16:04:10

Node.js内存泄漏

2017-04-10 13:26:06

Go语言源码

2021-10-31 15:46:34

Go语言进程
点赞
收藏

51CTO技术栈公众号