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