谁能解释这个 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 崩溃转储?的主要内容,如果未能解决你的问题,请参考以下文章
RabbitMQ/Erlang 崩溃:无法重新分配 313760 字节的内存(“代码”类型)
有人可以解释 Erlang 中 Pid(进程标识符)的结构吗?