golang阅读XML内存泄漏?

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)

稍后运行,在盒子内存耗尽之前,产生更高的总数,但几乎相同的百分比.任何人都可以帮助我们吗?我们缺少什么?

提前致谢!

Eve*_*man 7

每次尝试打印出您的信息.它将继续将字段附加到原始结构上.

您需要在执行完所需操作后重置该消息m = message{},将其清除,否则它将继续增长.