SP
State#st{buf = [fun() -> do_smth(State#st.field) end | Buf0]}) на предыдущую версию стейта ссылающуются на предыдущую версию стейта ссылающуюся....Size: a a a
SP
State#st{buf = [fun() -> do_smth(State#st.field) end | Buf0]}) на предыдущую версию стейта ссылающуются на предыдущую версию стейта ссылающуюся....SP
fun() -> ... St#st.field ... end захватывает весь State а не только одно поле из него. Пока оно лежит в heap одного процесса то эти ссылки не сильно вредят. Но если этот стейт попытаться отправить другому процессу (sys:get_state() или крешлог), то всё это дерево начнёт разворачиватьсяAB
SP
AB
SP
SP
SP
State вместо одного из полей State?AB
DG
AP
0xdeadbeef becomes <<222,173,190,239>>. Even without the <<>> wrapping, each byte is represented on average on 2.57 digits, or 3.57 characters if we count the comma too. But if the data is stored as a string in Erlang, it will be encoded as a list of Unicode code points, requiring 2 words of storage per list element. So our initial 1 GB binary data pretty printed as a string will take about 1 GB × 3.57 characters/byte × 2 words/character × 8 bytes/word = 57.12 GB memory. SP
<<222,173,190,239>> это 4 байта а "<<222,173,190,239>>" это по 2 машинных слова на каждую букву в этой строке length("<<222,173,190,239>>") * erlang:system_info(wordsize) * 2. Не уверен что это правильный способ подсчёта...SP
erlang:system_info(wordsize) видимо в битахSP
(kred@7V6PR73)3> erlang:system_info(wordsize).
8
(kred@7V6PR73)4> erts_debug:size("<<222,173,190,239>>").
38
(kred@7V6PR73)5> length("<<222,173,190,239>>") * erlang:system_info(wordsize) * 2.
304
(kred@7V6PR73)6> erts_debug:size(<<222,173,190,239>>).
6
(kred@7V6PR73)7> length("<<222,173,190,239>>") * erlang:system_info(wordsize) div 8 * 2.
38
SP
io_lib:format("~p", [Term]), то результат (iolist - строка) будет, как правило, занимать в памяти в разы больше чем исходный терм на heap эрланг-процесса.ИИ
SP