首页 > 解决方案 > “找不到下一个堆大小:18446744071789822643,偏移量 0”

问题描述

我写了一个模拟器,它分布在两个主机上。当我启动几千个进程时,在编写了大约 10 分钟和 50 万个事件后,我的主 Erlang (OTP v22) 虚拟机崩溃并显示以下消息:

no next heap size found: 18446744071789822643, offset 0.

它始终是同一个数字 - 18446744071789822643。

因为我的服务器非常强大,所以故障转储也很大,我无法在无头服务器(未安装 WX)上查看它。

关于我可以查看的内容有什么提示吗?

我可以尝试调试此问题的第一件事是什么?

标签: erlangheap-memorycrash-dumps

解决方案


首先,看看怎么memory()说:

> memory().
[{total,18480016},
 {processes,4615512},
 {processes_used,4614480},
 {system,13864504},
 {atom,331273},
 {atom_used,306525},
 {binary,47632},
 {code,5625561},
 {ets,438056}]

检查哪一个正在增长 - processes, binary, ets?

如果是processes,请尝试i().在进程运行时输入 Erlang shell。你会看到类似的东西:

Pid                   Initial Call                          Heap     Reds Msgs
Registered            Current Function                     Stack              
<0.0.0>               otp_ring0:start/2                      233     1263    0
init                  init:loop/1                              2              
<0.1.0>               erts_code_purger:start/0               233       44    0
erts_code_purger      erts_code_purger:wait_for_request        0              
<0.2.0>               erts_literal_area_collector:start      233        9    0
                      erts_literal_area_collector:msg_l        5              
<0.3.0>               erts_dirty_process_signal_handler      233      128    0
                      erts_dirty_process_signal_handler        2              
<0.4.0>               erts_dirty_process_signal_handler      233        9    0
                      erts_dirty_process_signal_handler        2              
<0.5.0>               erts_dirty_process_signal_handler      233        9    0
                      erts_dirty_process_signal_handler        2              
<0.8.0>               erlang:apply/2                        6772   238183    0
erl_prim_loader       erl_prim_loader:loop/3                   5              

寻找一个堆很大的进程,这就是你开始寻找内存泄漏的地方。

(如果你不是无头运行,我建议用 启动 Observer observer:start(),然后看看 Erlang 节点中发生了什么。)


推荐阅读