最近项目内存占用过多,检查一下erlang的内存使用情况。
1. 通过etop可以很方便得出erlang内存使用的情况
spawn(fun() -> etop:start([{output, text}, {interval, 5}, {lines, 20}, {sort, memory}]) end).
可以定义显示的时间、行数、按照内存使用的大小排列。
2.一般情况etop都能很稳定地工作,但个别极端情况下,etop会使用不了。这个情况下,只能上命令:
RawList = [{Pid, element(2, erlang:process_info (Pid, memory))} || Pid <- processes ()].
SortList = lists:reverse(lists:keysort(2, RawList)).
rp(lists:sublist(SortList, 20)).
上面2个方法都可以找出最占用内存的20个进程。
接着我们就可以找出内存的内存情况。
假设一个内存pid为<0.928.0>,在shell终端中使用rp()打印所有信息。
rp(erlang:process_info(pid(0, 928, 0))).
如果进程信息比较大,直接输出到文件:
file:write_file("process_info.txt", [io_lib:format("~p", [erlang:process_info(pid(0, 928, 0))])]).
注意:上面写入文件,如果进程使用的内存过大,会导致上线的项目崩溃,慎用。
上面可以获取到进程的进程字典信息,但进程的状态信息不在这里。
获取进程的状态信息:
rp(erlang:process_info(pid(0, 928, 0), backtrace)).
上面这个方法占用内存很少,可以快速定位进程的当前状态的信息,建议第一时间使用。