|
|
@ -2,29 +2,41 @@ |
|
|
|
|
|
|
|
-compile([export_all, nowarn_export_all]). |
|
|
|
|
|
|
|
-define(MEM_INFO_INIT(), mem_info_init(?MODULE, ?LINE)). |
|
|
|
-define(MEM_INFO_PRINT(), mem_info_print(?MODULE, ?LINE, 100)). |
|
|
|
-define(MEM_INFO_PRINT(Threshold), mem_info_print(?MODULE, ?LINE, Threshold)). |
|
|
|
-define(MEM_INFO_INIT(), memInfoInit(?MODULE, ?LINE)). |
|
|
|
-define(MEM_INFO_PRINT(), memInfoPrint(?MODULE, ?LINE, 100)). |
|
|
|
-define(MEM_INFO_PRINT(Threshold), memInfoPrint(?MODULE, ?LINE, Threshold)). |
|
|
|
|
|
|
|
-define(pdMemInfo, '$pdMemInfo'). |
|
|
|
memInfoInit(CurModule, CurLine) -> |
|
|
|
erlang:put(?pdMemInfo, {CurModule, CurLine, erlang:system_time(nanosecond), recon:info(self(), memory_used), erlang:memory()}). |
|
|
|
|
|
|
|
mem_info_init(CurModule, CurLine) -> |
|
|
|
erlang:put(pdMemInfo, {CurModule, CurLine, erlang:system_time(nanosecond), recon:info(self(), memory_used)}). |
|
|
|
|
|
|
|
mem_info_print(CurModule, CurLine, Threshold) -> |
|
|
|
case erlang:get(pdMemInfo) of |
|
|
|
memInfoPrint(CurModule, CurLine, Threshold) -> |
|
|
|
case erlang:get(?pdMemInfo) of |
|
|
|
undefined -> |
|
|
|
erlang:put(pdMemInfo, {CurModule, CurLine, erlang:system_time(nanosecond), recon:info(self(), memory_used)}); |
|
|
|
{OldModule, OldLine, OldTimeTick, OldMemInfo} -> |
|
|
|
erlang:put(?pdMemInfo, {CurModule, CurLine, erlang:system_time(nanosecond), recon:info(self(), memory_used), erlang:memory()}); |
|
|
|
{OldModule, OldLine, OldTime, OldMemInfo, OldSumInfo} -> |
|
|
|
CurMemInfo = recon:info(self(), memory_used), |
|
|
|
CurTimeTick = erlang:system_time(nanosecond), |
|
|
|
erlang:put(pdMemInfo, {CurModule, CurLine, CurTimeTick, recon:info(self(), memory_used)}), |
|
|
|
OldUsed = element(2, lists:nth(1, element(2, OldMemInfo))), |
|
|
|
CurUsed = element(2, lists:nth(1, element(2, CurMemInfo))), |
|
|
|
Sub = CurUsed - OldUsed, |
|
|
|
case erlang:abs(Sub) >= Threshold of |
|
|
|
CurTime = erlang:system_time(nanosecond), |
|
|
|
CurSumInfo = erlang:memory(), |
|
|
|
erlang:put(?pdMemInfo, {CurModule, CurLine, CurTime, CurMemInfo, CurSumInfo}), |
|
|
|
SubPid = element(2, lists:nth(1, element(2, CurMemInfo))) - element(2, lists:nth(1, element(2, OldMemInfo))), |
|
|
|
SubSum = element(2, lists:keyfind(total, 1, CurSumInfo)) - element(2, lists:keyfind(total, 1, OldSumInfo)), |
|
|
|
case erlang:abs(SubSum) >= Threshold orelse erlang:abs(SubPid) >= Threshold of |
|
|
|
true -> |
|
|
|
io:format("IMY*********Memory use changes are too large~n ~p~n ~p~n ~p~n ~p~n ", |
|
|
|
[{add_or_sub, Sub}, {time_diff, CurTimeTick - OldTimeTick}, {old, OldModule, OldLine, OldMemInfo}, {cur, CurModule, CurLine, CurMemInfo}]); |
|
|
|
io:format( |
|
|
|
"IMY*********Memory use changes are too large:~n" |
|
|
|
"addOrSubSum:~20w~n" |
|
|
|
"addOrSubPid:~20w~n" |
|
|
|
"usedTimeDiff:~19w~n" |
|
|
|
"oldLine:~w~n" |
|
|
|
"CurLine:~w~n" |
|
|
|
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n" |
|
|
|
"OldSumInfo:~w~n" |
|
|
|
"CurSumInfo:~w~n" |
|
|
|
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n" |
|
|
|
"OldPidInfo:~p~n" |
|
|
|
"************************************************************************************~n" |
|
|
|
"CurPidInfo:~p~n", [SubSum, SubPid, CurTime - OldTime, {old, OldModule, OldLine, OldTime}, {cur, CurModule, CurLine, CurTime}, OldSumInfo, CurSumInfo, OldMemInfo, CurMemInfo]); |
|
|
|
_ -> |
|
|
|
ignore |
|
|
|
end |
|
|
@ -325,28 +337,33 @@ get_test2() -> |
|
|
|
gc() -> |
|
|
|
lists:foreach(fun(Pid) -> erlang:garbage_collect(Pid) end, erlang:processes()). |
|
|
|
|
|
|
|
tt_f1(Term) -> |
|
|
|
?MEM_INFO_INIT(), |
|
|
|
A = io_lib:format("~w", [Term]), |
|
|
|
?MEM_INFO_PRINT(0). |
|
|
|
|
|
|
|
tt_f2(Term) -> |
|
|
|
?MEM_INFO_INIT(), |
|
|
|
A = eFmt:format("~w", [Term]), |
|
|
|
?MEM_INFO_PRINT(0). |
|
|
|
|
|
|
|
tt_f11() -> |
|
|
|
?MEM_INFO_INIT(), |
|
|
|
A = io_lib:format("~w", [get_test()]), |
|
|
|
?MEM_INFO_PRINT(0), |
|
|
|
A. |
|
|
|
?MEM_INFO_PRINT(0). |
|
|
|
|
|
|
|
tt_f12() -> |
|
|
|
?MEM_INFO_INIT(), |
|
|
|
A = eFmt:format("~w", [get_test()]), |
|
|
|
?MEM_INFO_PRINT(0), |
|
|
|
A. |
|
|
|
?MEM_INFO_PRINT(0). |
|
|
|
|
|
|
|
tt_f21() -> |
|
|
|
?MEM_INFO_INIT(), |
|
|
|
A = io_lib:format("~w", [get_test2()]), |
|
|
|
?MEM_INFO_PRINT(0), |
|
|
|
A. |
|
|
|
?MEM_INFO_PRINT(0). |
|
|
|
|
|
|
|
tt_f22() -> |
|
|
|
?MEM_INFO_INIT(), |
|
|
|
A = eFmt:format("~w", [get_test2()]), |
|
|
|
?MEM_INFO_PRINT(0), |
|
|
|
A. |
|
|
|
|
|
|
|
?MEM_INFO_PRINT(0). |
|
|
|
|