erlang中檢查內存泄露

最近項目內存佔用過多,檢查一下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)).

上面這個方法佔用內存不多,能夠快速定位進程的當前狀態的信息,建議第一時間使用。  

相關文章
相關標籤/搜索