【问题标题】:Go: time.sleep and memory usageGo:time.sleep 和内存使用情况
【发布时间】:2016-03-29 12:04:30
【问题描述】:

运行下面的代码时,程序从 1.5M 左右开始,然后逐渐增长到 6.4M。我想知道为什么。 删除 time.sleep 可以解决问题。

有没有办法在默认情况下使用 for-select 模式并在默认情况下休眠一段时间而不更改任何内存?

在睡眠后调用 runtime.GC() 确实可以解决问题。我们可以在不调用 GC 的情况下实现相同的目标吗?

package main

import (
    "time"
)

func main() {
    c := make(chan struct{})
    for {
        select {
        case <-c:
            //some work
        default:
            //some work
            time.Sleep(time.Millisecond * 1)
        }
    }
}

同理:

package main

import (
    "time"
)

func main() {
    c := make(chan struct{})
    for {
        select {
        case <-c:
        case <-time.After(time.Millisecond * 10):
        }
    }
}

经过一段时间的研究,我用下面的代码实现了它。仍然想知道为什么 time.sleep 会增加内存使用量?

package main

import (
    "time"
)

func main() {
    c := make(chan bool)
    timer := time.NewTimer(0)
    for {
        select {
        case <-c:
        default:
            timer.Reset(time.Millisecond * 1)
            <-timer.C
        }
    }
}

【问题讨论】:

  • Time.Sleep 不会“增加内存”。内存消耗或使用,实际使用什么,何时或什么内存被释放或返回给操作系统是非常复杂的。
  • 使用 time.Timer 就可以了。当你说它很复杂时,我相信你。
  • 只需观察 gctrace 的输出,即可了解 GC 正在做什么。睡眠需要少量分配,最终需要清理。如果您正在做任何真正的“工作”,它可能需要一些需要清理的分配。 GC 不是即时的,它会等到达到某个阈值后再运行,因此堆在稳定之前会有所增长。

标签: memory time go sleep


【解决方案1】:

您可以使用select 实现超时并从&lt;-time.After() 接收:

select {
  case res := <-c:
    fmt.Println("do some work")
  case <-time.After(time.Second * 1):
    fmt.Println("timeout")
}

如果您想了解您的程序如何利用内存,您可以进行分析。 Here 是一篇关于这个主题的好文章。

【讨论】:

  • 移除 default: 并改用 case &lt;-time.After(time.Millisecond * 10): 仍然会随着时间的推移增加内存使用量。我想这是时间 pkg 内部的东西。
【解决方案2】:

经过一段时间的研究,我用下面的代码实现了。

package main

import (
    "time"
)

func main() {
    c := make(chan bool)
    timer := time.NewTimer(0)
    for {
        select {
        case <-c:
        default:
            timer.Reset(time.Millisecond * 1)
            <-timer.C
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多