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

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


故障转储已写入:erl_crash.dump

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

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

【问题讨论】:

  • 显示您的代码。可能是它不是您的代码中的尾递归,因此它不在恒定地址空间中运行。

标签: erlang heap-memory erlang-shell erlang-ports wxerlang


【解决方案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 会因该内存分配错误而崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 2021-01-08
      • 2012-02-12
      • 1970-01-01
      • 2016-04-10
      • 2010-10-19
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多