Кто-нибудь может объяснить эту Erlang Crash dump?

Я получил это сообщение об ошибке при запуске моего приложения Erlang.


Дамп сбоя записан по адресу: erl_crash.dump

eheap_alloc: Невозможно выделить 18446744071692551144 байт памяти (типа "куча").

Это простая программа, запущенная на простом ПК. Как можно получить такие цифры? Кстати, пытается выделить 10^10 Гб. Программа в основном запускает только хвостовую рекурсию и довольно небольшое количество процессов.

2 ответа

Решение

Если вы получаете эту ошибку при запуске приложения, это означает, что одна из ваших функций вызывает рекурсивно и пытается выделить столько памяти, где ОС не предоставит ВМ, и, следовательно, ВМ вылетает с этой ошибкой выделения памяти.

Раньше, когда я сталкивался с подобными дампами, это было вызвано огромным почтовым ящиком в процессе, он сложил миллионы сообщений.

Вы можете проверить это с помощью этого фрагмента кода:

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).
Другие вопросы по тегам