2016-09-15 4 views

Antwort

4

Es wird tief kopiert werden. Hier ist eine einfache Demo:

1> State = lists:seq(1, 1000000). 
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 
23,24,25,26,27,28,29|...] 
2> DoSomething = fun(State) -> io:format("~p~n", [process_info(self(), memory)]) end. 
3> spawn(fun() -> DoSomething(State) end), spawn(fun() -> DoSomething(State) end), spawn(fun() -> DoSomething(State) end). 
{memory,16583520} 
{memory,16583520} 
{memory,16583520} 

Im Gegensatz dazu, hier ist der Ausgang, wenn der Staat eine große binäre ist, die nie „tief“ kopiert wird, wenn mit mehreren Prozessen gemeinsam:

1> State = binary:copy(<<"a">>, 50000000). 
<<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"...>> 
2> DoSomething = fun(State) -> io:format("~p~n", [process_info(self(), memory)]) end. 
3> spawn(fun() -> DoSomething(State) end), spawn(fun() -> DoSomething(State) end), spawn(fun() -> DoSomething(State) end). 
{memory,8744} 
{memory,8744} 
{memory,8744} 

So ein Prozess mit einer Liste von ganzen Zahlen von 1 bis 1 Million verwendete ungefähr 16MB Speicher, während der mit einer großen binären 8KB verwendete (die binäre sollte eigentlich ein vernachlässigbarer Teil davon sein).

Verwandte Themen