memory-management - 为什么要在网络应用程序中进行垃圾收集?

标签 memory-management go garbage-collection erlang green-threads

考虑在每个请求都由用户级线程(ULT)(绿色线程/erlang进程/goroutine/...任何轻量级线程)处理的平台上构建一个Web应用程序。假设每个请求都是无状态的,并且在应用程序启动时获取数据库连接等资源并在这些线程之间共享。这些线程中什么情况下需要进行垃圾回收?

通常这样的线程运行时间很短(几毫秒),如果设计良好,不会使用超过几个(KB或MB)的内存。如果线程中分配的资源的垃圾收集是在线程退出时完成的,并且独立于其他线程,那么即使是第 98 个或第 99 个百分位数的请求也不会出现 GC 暂停。所有请求都将在可预测的时间内得到答复。

这样的模型有什么问题以及为什么它没有被广泛使用?

最佳答案

您的假设可能不正确。

if well designed doesn't use more than a few (KB or MB) of memory

想象一个用于计算 Web 应用程序中使用的文本文件中单词数的函数。一些简单的实现可能是,

def count_words(text):
    words = text.split()
    count = {}
    for w in words:
        if w in count:
            count[w] += 1
        else:
            count[w] = 1
    return count

它分配的内存比文本更大。

关于memory-management - 为什么要在网络应用程序中进行垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27959094/

相关文章:

html - Go http.Handle() 未按预期工作。 404 找不到文件

regex - gorilla Mux 正则表达式

c# - 性能/风格 : Changing an object by reference vs returning a copy in C#

javascript - 在 JavaScript 中删除对象的最佳方法是什么?

java - Akka java 线程在多个 JVM 上阻塞

R 内存管理/无法分配大小为 n Mb 的向量

java - 如何成对存储 int 和 boolean

c++ - 如何跟踪列表列表的分配内存?

c++ - 指向动态分配对象的指针 vector : what could go wrong?

linux - 尝试在 Windows 10 上为 Linux 构建 Go 代码时出错