erlang - Erlang如何处理内存不足的问题?

标签 erlang out-of-memory fault-tolerance

根据 Erlang 的“让它崩溃”的理念,如果一个进程无法分配继续其操作所需的内存,人们会期望整个 VM 不会崩溃。事实上,如果系统有一个启发式方法来杀死某个进程以释放一些内存,那么其他一些进程会处理这个并恢复。根监督者可能不太可能被启发式方法杀死。

这与大多数现代流行语言形成鲜明对比,后者只是死掉或让操作系统选择做什么。

在 Erlang 中实际上是如何处理内存不足的?

最佳答案

当 Erlang VM 在内存不足的情况下运行时,它只会使整个 VM 崩溃。原因是这是最简单和最安全的事情。

如果您想要一个容错系统,您必须已经拥有多台计算机。您无法仅使用一台计算机(精确的自治计算单元)来构建容错系统。因此,如果您的应用程序在内存不足的情况下运行,最简单的方法就是让整个 VM 崩溃。无论如何,您的系统中有错误。

处理所有边缘情况——你可以处理哪些内存不足,哪些不能处理——太复杂且容易出错。杀死有问题的进程不是解决方案。首先,哪个是违规过程很难决定。杀死一些“随机”(启发式决定的)进程也不是一个解决方案,因为这个被启发式杀死的进程可能是负责意外恢复的进程。杀死整个 VM 不仅是解决内存不足情况的最简单而且也是唯一合理的解决方案。

在您需要可靠系统的情况下,大多数现代流行语言或操作系统的完成方式肯定是错误的。它对于桌面或不太严格的要求是可以接受的,但对于 Erlang 设计的系统绝对不能接受。

关于erlang - Erlang如何处理内存不足的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11112261/

相关文章:

ubuntu - 如何安装特定版本的钢筋?

functional-programming - Erlang:优雅的 tuple_to_list/1

debugging - 如何在Erlang中使用trace和dbg来调试和跟踪我的程序?

erlang - 钢筋3 : dependency is not reachable

android - Android 上的 OutOfMemory 异常

scala - Spark清理shuffle溢出到磁盘

akka - 微服务风格和权衡 - Akka 集群 vs Kubernetes vs

java - 多线程时出现 OutOfMemory 异常...堆空间?

python - tensorflow 监控 session 使用情况

sqlite - SQLite3的数据库文件在突然断电或系统崩溃时会损坏吗?