Review Request JDK-8202113: Reflection API is causing caller classes to leak

mandy chung mandy.chung at oracle.com
Sun May 20 03:25:57 UTC 2018


Hi Peter,

Sorry for the late reply.  I was on vacation last week and just returned.

On 5/14/18 8:43 AM, Peter Levart wrote:
> Hi Mandy,
>
> Sorry for noticing this too late, but...
>
> If it was not necessary to keep legacy hacky behavior (to honor the 
> patched "modifiers" field), wouldn't it be cleaner to leave the 
> ReflectionFactory as is, but modify the following private methods 
> instead:
>
> - Field#acquireFieldAccessor
> - Method#acquireMethodAccessor
> - Constructor#acquireConstructorAccessor
>
> They already deal with 'root' object and could pass it to 
> ReflectionFactory. The logic of ReflectionFactory need not deal with 
> the notion of 'root' object then and no LangReflectAccess additions 
> are necessary. You would keep the notion of root objects encapsulated. 
> With tour patch it has leaked into ReflectionFactory too.
>

I started with that approach but I wanted to assert that the root object 
is used to catch any future regression of the memory leak. There is 
other option doing that for example adding LangReflectAccess::isRoot or 
ensureRoot instead of getRoot method. I see all these are part of the 
reflection implementation.  We could revisit this code when we touch 
this area in the future.

> Is it really that important to allow users to modify static final 
> fields that way? As such fields are normally constant folded by JIT, I 
> doubt that anybody is doing it nowadays. Doing it is bound to 
> unpredictable program behavior, as JVM is free to never reload such 
> field's value.

Sadly, there are existing code using this hack.   As Alan said, we will 
find out more once the illegal access is denied by default.  I prefer to 
separate this breakage from this issue and disable the hack to change 
static final field via reflection completely in another day.

Mandy


More information about the core-libs-dev mailing list