RFR 8151486 : Class.forName causes memory leak

Brent Christian brent.christian at oracle.com
Wed Oct 5 21:48:37 UTC 2016


Yes!  Good catch, thanks.
-Brent

On 10/5/16 2:08 PM, Naoto Sato wrote:
> Typo in ClassForNameLeak.java? At line 103, "change" -> "chance"?
>
> Naoto
>
> On 10/5/16 12:38 PM, Brent Christian wrote:
>> Hi,
>>
>> Please review my fix for 8151486, "Class.forName causes memory leak".
>>
>> Bug:
>> https://bugs.openjdk.java.net/browse/JDK-8151486
>> Webrev:
>> http://cr.openjdk.java.net/~bchristi/8151486/webrev.00/
>>
>> The test case reproduces the bug as such:
>>
>> With a SecurityManager enabled, a class ("ClassForName") is loaded from
>> a user classloader (isa URLClassLoader, "LeakedClassLoader"), and from
>> that class makes a call to Class.forName() on the system classloader.
>> (The specific class name isn't so important, I just used
>> java.util.List).  The result is that the user's classloader is never
>> collected.
>>
>> The leak occurs because of the following:
>>
>> Class.forName0() is passed the "caller" class, ClassForName.
>>
>> JVM_FindClassFromCaller will "find a class with this name
>> (java.util.List) in this loader (the system classloader), using the
>> caller's (ClassForName's) protection domain.  A ProtectionDomain is
>> created for ClassForName, with ProtectionDomain.classloader referring to
>> LeakedClassLoader.
>>
>> This PD is passed to ClassLoader.checkPackageAccess(), and is added to
>> 'domains' of the system classloader (ClassLoader.java line 643).  Thus,
>> the system classloader holds a reference to the user's classloader via
>> 'domains'.
>>
>> Nothing is ever removed from 'domains'.  In fact, besides being added
>> to, I found no other uses of 'domains' - not in library code, not in
>> hotspot.  (From my research, it's questionable if 'domains' was ever
>> used).
>>
>> Removal of 'domains' fixes the leak, and cleans out a little bit of
>> unused code.
>>
>> Automated building and testing (JPRT, RBT) looks fine.
>>
>> Thanks!
>> -Brent
>>


More information about the core-libs-dev mailing list