Mik*_*war 7 xml profiling memory-leaks go
我们最近使用golang和encoding/xml.解码了很多XML .我们注意到,在相当多的文件之后,我们的盒子耗尽内存,开始交换,并且通常会死于不幸的死亡.所以我们做了一个测试程序.这里是:
package main
import (
"encoding/xml"
"io/ioutil"
"log"
"time"
)
// this XML is for reading AWS SQS messages
type message struct {
Body []string `xml:"ReceiveMessageResult>Message>Body"`
ReceiptHandle []string `xml:"ReceiveMessageResult>Message>ReceiptHandle"`
}
func main() {
var m message
readTicker := time.NewTicker(5 * time.Millisecond)
body, err := ioutil.ReadFile("test.xml")
for {
select {
case <-readTicker.C:
err = xml.Unmarshal(body, &m)
if err != nil {
log.Println(err.Error())
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它所做的就是一遍又一遍地重复解码XML文件.我们的框显示相同的症状:二进制文件的内存使用量无限制地增长,直到框开始交换.
我们还添加了一些分析代码,它在20 pprof秒后触发到上面的脚本中,并得到以下内容top100:
(pprof) top100
Total: 56.0 MB
55.0 98.2% 98.2% 55.0 98.2% encoding/xml.copyValue
1.0 1.8% 100.0% 1.0 1.8% cnew
0.0 0.0% 100.0% 0.5 0.9% bytes.(*Buffer).WriteByte
0.0 0.0% 100.0% 0.5 0.9% bytes.(*Buffer).grow
0.0 0.0% 100.0% 0.5 0.9% bytes.makeSlice
0.0 0.0% 100.0% 55.5 99.1% encoding/xml.(*Decoder).Decode
...
Run Code Online (Sandbox Code Playgroud)
稍后运行,在盒子内存耗尽之前,产生更高的总数,但几乎相同的百分比.任何人都可以帮助我们吗?我们缺少什么?
提前致谢!
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |