首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么内存块没有被垃圾收集器清除?

为什么内存块没有被垃圾收集器清除?
EN

Stack Overflow用户
提问于 2015-09-26 19:09:06
回答 1查看 596关注 0票数 3
代码语言:javascript
复制
package main

import (
        "fmt"
        "net/http"
        "runtime"
)

func handler(w http.ResponseWriter, r *http.Request) {
       largeMemAlloc := make([]int, 100000000)
       largeMemAlloc[1] = 100//lol
       fmt.Fprintf(w, "hi from handler")
       runtime.GC()
}

func main() {
       http.HandleFunc("/", handler)
       http.ListenAndServe(":7777", nil)
}

一旦我访问http://127.0.0.1:7777 4-5次,使用的内存进入GBs。

它大约在4到5分钟,内存仍然是无人认领的操作系统。为什么会发生这种情况?

我做错了什么?

我正在编译这个在go 1.5中

编辑: 10分钟后,内存使用量下降到只有50 10。但我不明白为什么要花这么长时间才能收回这段记忆。我觉得我做了一件可怕的错事。

EN

回答 1

Stack Overflow用户

发布于 2017-06-02 11:31:42

Go不会立即将内存释放回操作系统,即使通过垃圾收集(GC)回收内存。这是一个性能改进,因为它可能需要再次内存。你没做错什么。在不了解未来需求的情况下,考虑到从操作系统中压缩、释放和分配内存的开销,每个GC都需要进行这种性能权衡。在JVM和Linux内核的上下文中,研究了如何使操作系统提供的API更有效。用户空间OOM处理是一种最近的、不那么雄心勃勃的Linux内核开发,GC可以在最需要的时候使用它来更早地发布内存。

据我所知,没有官方规定的留记忆时间上限。然而,在Go 1.3垃圾收集器未将服务器内存释放回系统中,它被实验证实为9分钟(至少在2分钟+7分钟保持内存后发生的GC )。

您可以通过调用runtime.debug.FreeOSMemory()手动触发此操作,但这通常不是一个好主意,除非出于调试目的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32800952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档