memory - Go: time.sleep 和内存使用

标签 memory time go sleep

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

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

在 sleep 后调用 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
        }
    }
}

最佳答案

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

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

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

关于memory - Go: time.sleep 和内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36283788/

相关文章:

c - 类型的大小和内存分配

date - "month out of range"解析不带分隔符的日期时

go - Golang 中二进制字节数组的终止指示器?

go - 在 Go 中连接 Google Calendar API 的凭据

API 认证流程

java - for 循环中的内存管理和速度

java - 限制 ubuntu 上的 jvm 进程内存

c - 在 L1 缓存 : only getting 62% 中获取 Haswell 上的峰值带宽

java - 多线程环境中的事件时间戳

linux - 将 HH :MM:SS (hours:minutes:seconds. split seconds) 转换为秒的简单方法