当前位置: 首页 > 面试题库 >

生产中的FreeOSMemory()

慕乐语
2023-03-14
问题内容

我在有TCP服务器的软件包中使用goroutines。大多数时候,响应非常沉重,但是当例程结束时,不会从内存中清除它。

func Handle() {
    service := ":7777"
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
    checkError(err)
    listener, err := net.ListenTCP("tcp", tcpAddr)
    checkError(err)
    defer listener.Close()

    for {
        conn, err := listener.Accept()
        checkError(err)
        go handleRequest(conn, db)

    }
}

func handleRequest(conn net.Conn, db *sql.DB) {
    message := make([]byte, 0, 4096)
    tmp := make([]byte, 256)
    n, err := conn.Read(tmp)
    if err != nil {
        if err != io.EOF {
            fmt.Println("read error:", err)
        }
    }
    message = append(message, tmp[:n]...)
    fmt.Println("Message Received:", string(message))
    // do something to get resp
    conn.Write(append(resp, []byte("\n")...))
    conn.Close()
    debug.FreeOSMemory()
    return
}

因此,在这种情况下,响应很大,并且可以使用10%的内存作为goroutine,因为我从数据库中获得了170.000个用户并将结果解析为JSON。但是当handleRequest仍然在内存中时,如果我没有使用debug.FreeOsMemory()。我怀疑这是否是一种好方法,因为它位于调试包中,所以我的问题
是清空goroutines正在使用的内存的好方法
吗?我对其进行了测试,因此它不会对系统造成影响,并且无法很好地工作。如果没有,什么是好的方法?我等不及要清理GC吗,这就是为什么我开始使用它的原因,在第一个答案中有最后一个建议。


问题答案:

Go运行时不会将可用内存立即“释放”回OS,这会造成效率低下。

您应该让Go运行时处理此问题。如果您的应用程序不稳定而没有调用debug.FreeOsMemory(),则存在更大的问题,即使它“看似”有帮助,您也不应对此加以掩盖。甚至可能使情况变得更糟,好像为一个请求提供服务确实需要大量内存(在完成请求后,GC会适当释放该内存),调用FreeOsMemory()只会将其返回到运行时必须要求的OS。
/在处理另一个请求时再次分配。如果您还没有将其交还给操作系统,它将可用于下一个请求…

尝试减少请求处理程序的内存需求。如果不可能(可疑),请限制可能需要同时处理的大内存请求的数量。



 类似资料:
  • 问题内容: 我目前在我的生产代码中使用HtmlUnit和Selenium来驱动它(WebDriver)。 我使用这些库通过编程与各种网站进行交互,并且取得了一些成功,并且没有遇到内存问题(确保始终清理会话)。 我想知道这些库是否适合生产环境或推荐使用。由于存在大量有关自动化测试的信息,而不是我的使用方式,因此很难通过Google进行查找。 我意识到这是一个相当笼统的问题,但是我正在寻求有关这些库以

  • 问题内容: 我目前在生产代码中使用HtmlUnit和Selenium来驱动它(WebDriver)。 我使用这些库通过编程与各种网站进行交互,并取得了一些成功,并且没有遇到内存问题(确保始终清理会话)。 我想知道这些库是否适合生产环境或不建议使用。由于存在大量有关自动化测试的信息,而不是我的使用方式,因此很难通过Google进行查找。 我意识到这是一个相当普遍的问题,但是我正在寻求有关这些库以及可

  • 我是Vue的初学者,现在我正在与CORS问题作斗争。在开发我的应用程序(http://localhost:8080/)时,向http://zz.zz.zz.zz:3000/发送请求,这些代码帮助我修复了CORS: vue.config.js 但当我的应用程序在生产(http://zz.zz.zz.zz:3001/)发送请求http://zz.zz.zz.zz:3000/它会得到CORS错误。我尝试

  • 生产中的EAP EAP在默认的FreeRADIUS安装中开箱即用。但是,也有一些要点需要注意或更改以适应您的环境。在本节中,我们将介绍以下几点: 适当的公钥基础设施(PKI)的重要性 配置内部隧道虚拟服务器 内部和外部隧道识别的问题 禁用未使用的EAP方法 公共密钥基础设施简介公钥基础结构主要用于两件事: 验证某人的身份 通过不安全的连接交换安全数据 为了确保某人是他们声称的人,我们使用证书颁发机

  • 问题内容: 当我计算时, 我会使用Java。在Python中,我得到的结果。我该怎么做才能在Java中使用模函数获得相同的行为? 问题答案: 这里的问题是,在Python中,%运算符返回模数,而在Java中,它返回余数。这些函数为正参数提供相同的值,但是模数对于负输入始终返回正结果,而其余部分可能给出负结果。这个问题还有更多的信息。 你可以通过执行以下操作找到正值: 或这个: (显然,-1或2可以

  • 我有ubuntu服务器、Rails 5.0和apache Web服务器,上面还有很多站点。 当我添加新站点时,我收到一个错误“收到来自应用程序的不完整响应” 当我检查apache日志时,我看到消息: 我的配置/机密。yml包含默认值: 另外,我刚刚通过在文件中写入设置了环境变量SECRET_KEY_BASE /etc/profile 我看到than通过命令< code > echo$SECRET