On Sat, Jun 29, 2019 at 11:25 PM Benjamin Morel <benjamin.mo...@gmail.com>
wrote:

> > The problem here is that OP is *creating* many classes (the fact that
> they are anonymous ultimately doesn't matter) by eval'ing code. That is
> what causes the leak.
>
> I still don't understand why there is no leak when *not* using eval(),
> though.
>
> Ben
>

Without eval you are creating many objects of the same anonymous class.
With eval you are creating a single object each for many anonymous classes.
In the first case there is only a single class, in the second there are as
many classes as there are eval()s.

That's the theory. In practice we have a long-standing bug with RTD key
collisions -- this means that the names generated for anonymous classes
(and closures for that matter) are not actually unique. For anonymous
classes the current workaround is to reuse the existing class definition if
an RTD key collision occurs. For your original code (and I should say that
this is very specific to the code because it is susceptible to memory
layout details) it happens that the RTD key for all those anonymous classes
is the same, so in the end you end up with just one class definition also
in the eval() case. The leaked memory is an allocated but unused class
entry. We could plug that particular leak -- but I should emphasize that
the current behavior is incorrect and once the key collision issue is
resolved this will create a new class for each eval.

Nikita

Reply via email to