Ruby 为什么Rails应用程序运行垃圾收集器?

Ruby 为什么Rails应用程序运行垃圾收集器?,ruby,garbage-collection,rack,application-server,preemption,Ruby,Garbage Collection,Rack,Application Server,Preemption,我非常确定,所有应用服务器(我有一些使用和的经验)在创建时都是为每个工作人员创建单个进程,并且其状态为“冻结” 每当AppServer接收到处理请求时,它都会从主进程派生,并且对派生进程的所有进一步更改都会与原始进程分离。它们受益于写时拷贝优化,并且可以安全地被处理请求“破坏”。对环境的所有更改只影响将被抢占的单个进程 如果我对RoR应用程序堆栈的看法是正确的,那么应该几乎不需要垃圾收集,除非服务单个请求需要大量时间和内存(通常情况并非如此) 另一方面,它的答案让我得出结论,我一定是完全错了 有

我非常确定,所有应用服务器(我有一些使用和的经验)在创建时都是为每个工作人员创建单个进程,并且其状态为“冻结”

每当AppServer接收到处理请求时,它都会从主进程派生,并且对派生进程的所有进一步更改都会与原始进程分离。它们受益于写时拷贝优化,并且可以安全地被处理请求“破坏”。对环境的所有更改只影响将被抢占的单个进程

如果我对RoR应用程序堆栈的看法是正确的,那么应该几乎不需要垃圾收集,除非服务单个请求需要大量时间和内存(通常情况并非如此)

另一方面,它的答案让我得出结论,我一定是完全错了


有人能澄清这个过程吗?

机架应用程序服务器在每次请求时都不会分叉,只是在初始化期间:

  • 首先,在一个进程中加载环境
  • 然后,服务器会分叉几个工作人员
  • 然后,所有请求都分布在这些进程中

  • 这就是为什么垃圾收集器用于保持每个进程内存的干净和稳定。

    您确定Rails有垃圾收集器吗。。。?独角兽/乘客不会为每个请求创建单独的流程。他们分出多个工人来处理请求。@slivu:1。Ruby有一个GC。Rails是用Ruby编写的,应用服务器生成Ruby进程。2.
    fork()
    ing多个worker意味着创建子进程。如果您是对的,为什么在请求之间应用monkeypatch或更改全局变量不是持久的?这取决于您的monkey路径在哪里?在什么环境下?您是如何更改全局变量的?我做了一些测试来检查这一点,似乎我陷入了错误的结论,因为对环境所做的更改在工作人员之间不共享。如果您在工作人员分叉后更改了某些全局变量,您所做的更改肯定不会传播,这是不同的过程。但人们不会这样做,如果您需要更改环境,只需重新启动服务器即可;)