当前位置:  开发笔记 > 编程语言 > 正文

去:记忆问题

如何解决《去:记忆问题》经验,为你挑选了0个好方法。

我需要你的智慧.

我有一个用Go写的巨大守护进程.前段时间,用户报告代码中某处可能存在内存泄漏.

我开始调查这个问题.当主要代码检查没有让我得到关于泄漏性质的任何线索时,我试着关注我的过程如何工作.

我的想法很简单:如果我没有删除对某些对象的引用,我的堆应该不断增长.我编写了以下过程来监视堆:

func PrintHeap() {
    ticker := time.NewTicker(time.Second * 5)
    for {
        <-ticker.C
        st := &runtime.MemStats{}
        runtime.ReadMemStats(st)
        // From Golang docs: HeapObjects increases as objects are allocated
        // and decreases as the heap is swept and unreachable objects are
        // freed.
        fmt.Println("Heap allocs:", st.Mallocs, "Heap frees:",
            st.Frees, "Heap objects:", st.HeapObjects)
    }
}

此过程每5秒打印一些有关堆的信息,包括当前分配的对象数.

现在谈谈守护进程的作用.它处理来自某些UDP输入的行.每行都包含有关某个HTTP请求的一些信息,并被解析为典型的Go结构.此结构具有一些数字和字符串字段,包括一个用于请求路径.然后这个结构发生了很多事情,但这些事情在这里是无关紧要的.

现在,我将输入速率设置为每秒1500行,每行都相当短(您可以将其读作:使用标准请求路径/).

运行应用程序后,我可以看到堆大小在某个时间点稳定:

Heap allocs: 180301314 Heap frees: 175991675 Heap objects: 4309639
Heap allocs: 180417372 Heap frees: 176071946 Heap objects: 4345426
Heap allocs: 180526254 Heap frees: 176216276 Heap objects: 4309978
Heap allocs: 182406470 Heap frees: 177496675 Heap objects: 4909795
Heap allocs: 183190214 Heap frees: 178248365 Heap objects: 4941849
Heap allocs: 183302680 Heap frees: 178958823 Heap objects: 4343857
Heap allocs: 183412388 Heap frees: 179101276 Heap objects: 4311112
Heap allocs: 183528654 Heap frees: 179181897 Heap objects: 4346757
Heap allocs: 183638282 Heap frees: 179327221 Heap objects: 4311061
Heap allocs: 185609758 Heap frees: 181330408 Heap objects: 4279350

达到此状态后,内存消耗将停止增长.

现在,我改变了我的输入,使得每行变得超过2k chars(具有巨大的/AAAAA...请求路径),这就是奇怪的事情开始发生的地方.

堆大小急剧增长,但在一段时间后仍然变得稳定:

Heap allocs: 18353000513 Heap frees: 18335783660 Heap objects: 17216853
Heap allocs: 18353108590 Heap frees: 18335797883 Heap objects: 17310707
Heap allocs: 18355134995 Heap frees: 18336081878 Heap objects: 19053117
Heap allocs: 18356826170 Heap frees: 18336182205 Heap objects: 20643965
Heap allocs: 18366029630 Heap frees: 18336925394 Heap objects: 29104236
Heap allocs: 18366122614 Heap frees: 18336937295 Heap objects: 29185319
Heap allocs: 18367840866 Heap frees: 18337205638 Heap objects: 30635228
Heap allocs: 18368909002 Heap frees: 18337309215 Heap objects: 31599787
Heap allocs: 18369628204 Heap frees: 18337362196 Heap objects: 32266008
Heap allocs: 18373482440 Heap frees: 18358282964 Heap objects: 15199476
Heap allocs: 18374488754 Heap frees: 18358330954 Heap objects: 16157800

但是内存消耗增长并且从未停止过.我的问题是:关于发生了什么的任何想法?

我想到了由于许多巨大的物体导致的内存碎片,但实际上我并不知道该怎么想.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有