我经历利尼和汤普森的“Erlang编程”(O'Reilly出版),我做了一个解决方案,以4-2,但玩了后,有两个问题:这个erlang代码为什么会吃这么多的内存?
我每次运行去/ 3,Windows中的“werl.exe”咀嚼X数量的RAM。随后的每次通话都会收到相同的金额,而且从未回收。
如果我去跑(消息,10000,10)它吃了1.4GB RAM和崩溃从我
我认为,在我的第二个情况下,二郎应该处理这个没问题一直在阅读,所以我的猜测是,我不知何故引入了内存泄漏?我阅读了关于内存泄漏和尾递归的部分,并没有看到我做错了什么。
在此先感谢。
-module(processRing). -export([waitMessage/0,go/3]). % Spawn M processes and pass Message around to each process N times go(Message,M,N) -> ProcList = buildList(M), [H | T ] = ProcList, register(firstProc,H), H ! {self(), T, ProcList, Message, N}. waitMessage() -> receive {_, _, _, _, 0} -> io:format("end!", []); {From, [H|T], AllProcs, Message, N} -> %io:format("~w:~w from:~w~n n=~w",[self(),Message,From,N]), H ! {self(), T, AllProcs, Message, N}, waitMessage(); {From, [], AllProcs, Message, N} -> io:format("~w:~w (Last in list) from:~w n=~w~n",[self(),Message,From,N]), firstProc ! {self(), AllProcs, AllProcs, Message, N - 1}, waitMessage(); Other -> io:format("other:~w~n",[Other]) end. buildList(N) when N > 0 -> [spawn(processRing,waitMessage,[]) | buildList(N - 1)]; buildList(0) -> [].
这并不真正回答问题#2。但是,当你注册一个进程时,你基本上正在创建和设置一个全局变量,这就是内存泄漏。 – Omnifarious 2009-12-23 22:52:18
@Omnifarious:只注册一个进程。 – Zed 2009-12-23 22:58:11
是的,但是这个过程可能通过引用保留所有其他过程。无论如何,看起来有人真的比我更好地回答了这个问题,虽然我是对的,但我的想法并不是全部真相,这就是为什么我没有把它作为答案。 :-)我自己是Erlang的新手。 – Omnifarious 2009-12-24 01:54:22