谁能解释这个 Erlang 崩溃转储?

Posted

技术标签:

【中文标题】谁能解释这个 Erlang 崩溃转储?【英文标题】:Can anyone explain this Erlang Crash dump? 【发布时间】:2013-12-20 04:19:33 【问题描述】:

我在运行我的 Erlang 应用程序时收到此错误报告。


故障转储已写入:erl_crash.dump

eheap_alloc:无法分配 18446744071692551144 字节的内存(“堆”类型)。

这是一个在简单 PC 上运行的简单程序。怎么可能得到这样的数字?顺便说一下,它正在尝试分配 10^10 gb。该程序基本上只运行尾递归和相当少量的进程。

【问题讨论】:

显示您的代码。可能是它不是您的代码中的尾递归,因此它不在恒定地址空间中运行。 【参考方案1】:

以前我遇到类似的转储,是由于进程中的一个巨大的邮箱引起的,它已经堆积了数百万条消息。

你可以用这个 sn-p 的代码来检查它:

top() ->
    Procs = lists:foldl(fun(Pid, Acc) ->
        case erlang:process_info(Pid, message_queue_len) of
            _K, V -> [Pid, V | Acc];
            _ -> Acc
        end
    end, [], erlang:processes()),
    lists:keysort(2, Procs).

【讨论】:

【参考方案2】:

如果您在运行应用程序时遇到此错误,这意味着您的某个函数正在递归调用并尝试分配操作系统无法提供给 VM 的那么多内存,因此 VM 会因该内存分配错误而崩溃。

【讨论】:

以上是关于谁能解释这个 Erlang 崩溃转储?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Erlang 中的模式匹配

RabbitMQ/Erlang 崩溃:无法重新分配 313760 字节的内存(“代码”类型)

ERlang 堆溢出

有人可以解释 Erlang 中 Pid(进程标识符)的结构吗?

Erlang:控制Erlang进程崩溃时如何使连接的外部OS进程自动死亡?

为啥我的 Erlang 应用程序崩溃了?