最近项目内存占用过多,检查一下erlang的内存使用状况。shell
1. 经过etop能够很方便得出erlang内存使用的状况spa
spawn(fun() -> etop:start([{output, text}, {interval, 5}, {lines, 20}, {sort, memory}]) end).
能够定义显示的时间、行数、按照内存使用的大小排列。code
2.通常状况etop都能很稳定地工做,但个别极端状况下,etop会使用不了。这个状况下,只能上命令:orm
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个进程。blog
接着咱们就能够找出内存的内存状况。进程
假设一个内存pid为<0.928.0>,在shell终端中使用rp()打印全部信息。内存
rp(erlang:process_info(pid(0, 928, 0))).
若是进程信息比较大,直接输出到文件:element
file:write_file("process_info.txt", [io_lib:format("~p", [erlang:process_info(pid(0, 928, 0))])]).
注意:上面写入文件,若是进程使用的内存过大,会致使上线的项目崩溃,慎用。it
上面能够获取到进程的进程字典信息,但进程的状态信息不在这里。io
获取进程的状态信息:
rp(erlang:process_info(pid(0, 928, 0), backtrace)).
上面这个方法占用内存不多,能够快速定位进程的当前状态的信息,建议第一时间使用。