根据 Erlang 的“让它崩溃”的理念,如果一个进程无法分配继续其操作所需的内存,人们会期望整个 VM 不会崩溃。事实上,如果系统有一个启发式方法来杀死某个进程以释放一些内存,那么其他一些进程会处理这个并恢复。根监督者可能不太可能被启发式方法杀死。
这与大多数现代流行语言形成鲜明对比,后者只是死掉或让操作系统选择做什么。
在 Erlang中实际上是如何处理内存不足的?
根据 Erlang 的“让它崩溃”的理念,如果一个进程无法分配继续其操作所需的内存,人们会期望整个 VM 不会崩溃。事实上,如果系统有一个启发式方法来杀死某个进程以释放一些内存,那么其他一些进程会处理这个并恢复。根监督者可能不太可能被启发式方法杀死。
这与大多数现代流行语言形成鲜明对比,后者只是死掉或让操作系统选择做什么。
在 Erlang中实际上是如何处理内存不足的?
当 Erlang VM 在内存不足的情况下运行时,它只会使整个 VM 崩溃。原因是这是最简单和最安全的事情。
如果您想要一个容错系统,您必须已经拥有多台计算机。您无法仅使用一台计算机(精确的自治计算单元)来构建容错系统。因此,如果您的应用程序在内存不足的情况下运行,最简单的方法就是让整个 VM 崩溃。无论如何,您的系统中有错误。
处理所有边缘情况——你可以处理哪些内存不足,哪些不能处理——太复杂且容易出错。杀死有问题的进程不是解决方案。首先,哪个是违规过程很难决定。杀死一些“随机”(启发式决定的)进程也不是一个解决方案,因为这个被启发式杀死的进程可能是负责意外恢复的进程。杀死整个 VM 不仅是解决内存不足情况的最简单而且也是唯一合理的解决方案。
在您需要可靠系统的情况下,大多数现代流行语言或操作系统的完成方式肯定是错误的。它对于桌面或不太严格的要求是可以接受的,但对于 Erlang 设计的系统绝对不能接受。