Кто-нибудь может объяснить эту 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).