<div dir="ltr"><div><div><div><div><div><div>The latter, ...<br><br></div>If you have some JSON and you decode that into, say, <br><br>#{<br></div>    <<"key">> := SomeValue,<br>    ...<br>}<br><br></div>Then SomeValue is a subbinary which keeps JSON alive. Now, what to do depends on the situation:<br><br></div>1. If SomeValue is not long-lived and you are throwing JSON away roughly at the same time as SomeValue, then you have no problems right away.<br><br></div>2. If SomeValue is long-lived and JSON is not, then you could potentially keep JSON around for a long time. This is where you can do X = binary:copy(SomeValue) to force X to be a fresh copy. This then puts you back into situation 1, and you will not have a problem.<br><br></div>It is not a priori obvious what is the right thing to do. There are trade-offs with processing speed, ease of use, gc behaviour and so on. If, for instance, jsonx made a new binary itself, then it would lose every performance benchmark to an implementation which uses the subbinary construction. And people tend to value their decoding speed over the ability to take out a VM for some odd reason :)<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 19, 2015 at 1:33 PM, Alexander Petrovsky <span dir="ltr"><<a href="mailto:askjuise@gmail.com" target="_blank">askjuise@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">If I understand correctly, you suggest call X = binary:copy(SomeBinary) and then call jsonx parser with X as parameter? Or just going through parsed result and then call binary:copy over each binary element?</div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">2015-10-17 13:50 GMT+03:00 Jesper Louis Andersen <span dir="ltr"><<a href="mailto:jesper.louis.andersen@gmail.com" target="_blank">jesper.louis.andersen@gmail.com</a>></span>:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 16, 2015 at 9:34 PM, Caragea Silviu <span dir="ltr"><<a href="mailto:silviu.cpp@gmail.com" target="_blank">silviu.cpp@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">7. jsonx</blockquote></div><br>This is a shot but I think this library is your problem. When it parses a JSON document, it uses enif_make_sub_binary on the binary() containing the JSON string. This means if you do not use binary:copy() on data you hoist out of the JSON document, then you are keeping the whole document around for as long as you refer to that subbinary. <br><br>Try wrapping strings you hoist out in binary:copy/1. This will slow you down, but it should remove the reference to the original binary which would make your system be able to reclaim that memory. Alternatively, if your system is not highly loaded, you could simply replace jsonx for jsx which is written in Erlang and avoids such problems (at the expense of slower parsing, but JSON will *never* win a parsing race anyway and it is better to swtch the format then).</div><div class="gmail_extra"><br></div><div class="gmail_extra">I've seen systems stuffing such subbinaries into ETS, and then your ETS table is keeping data around.</div><span><font color="#888888"><div class="gmail_extra"><br clear="all"><div><br></div>-- <br><div>J.</div>
</div></font></span></div>
<br></div></div><span class="">_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></span></blockquote></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br><div><div dir="ltr">Петровский Александр / Alexander Petrovsky,<br><br>Skype: askjuise<br><div>Phone: +7 914 8 820 815<div><br></div></div></div></div>
</font></span></div>
</blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature">J.</div>
</div>