Review Request: Add ClassOption.STRONG and default is unspecified

Mandy Chung mandy.chung at oracle.com
Wed Mar 11 22:12:53 UTC 2020


Webrev:
http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/weak-strong-class/

Alex suggests to keep the default unspecified, which I think it's a 
great suggestion such that people do not have to rely on the 
implementation assumption.

This patch adds a new ClassOption::STRONG enum constant while keeping 
ClassOption::WEAK.

Mandy

On 3/10/20 9:55 PM, John Rose wrote:
> I agree with Alex.  Class loaders map names to classes.  It’s not
> natural *semantically* for a nameless class to have its lifetime
> determined by a class loader.  It may be more natural *in our
> JVM implementation* (hence more performant, in the *current*
> implementation) to have a non-weak link, but let’s do this only
> if users request it explicitly.
>
> On Mar 10, 2020, at 4:55 PM, Mandy Chung <mandy.chung at oracle.com 
> <mailto:mandy.chung at oracle.com>> wrote:
>>
>> Brian, John, et al,
>>
>> Alex has given his feedback on the weak class feature (attached).
>>
>> Alex recommends to change the default of hidden classes be weak 
>> classes and introduce a ClassOption::STRONG option if it wants to 
>> ensure that the hidden class is not being reclaimed until the class 
>> loader becomes unreachable.  See more details below.
>>
>> We tried to keep a hidden class be a normal class from JVM's point of 
>> view.  Classes in the VM implementation have the same lifecycle as 
>> the defining class loader. In addition, LambdaForms and Nashorn are 
>> the only JDK use of hidden weak classes.  All others such as lambda 
>> metafactory and string concat use hidden (strong) classes as they are 
>> part of the target class' internal implementation and should be 
>> unloaded altogether. Hence strong reference to hidden classes is the 
>> default.
>>
>> What's your recommendation?
>>
>> Mandy
>>
>>
>> -------- Forwarded Message --------
>> Subject: 	Weak references to hidden classes
>> Date: 	Tue, 10 Mar 2020 16:16:50 -0700
>> From: 	Alex Buckley <alex.buckley at oracle.com>
>> Organization: 	Oracle Corporation
>> To: 	Mandy Chung <mandy.chung at oracle.com>
>>
>>
>>
>> JEP 371 says that a hidden class may be weakly referenced by its 
>> class loader. Which loader? The only loader with any connection to a 
>> hidden class is the loader nominated to serve as the defining loader 
>> by the API spec of defineHiddenClass. However, that spec doesn't say 
>> "The defining loader holds a strong reference to the hidden class" 
>> because no spec says anything about how a class loader refers to a class.
>>
>> (The only relationship we do specify is the other way around -- 
>> ClassLoader says "Every Class object contains a reference to the 
>> ClassLoader that defined it." -- and happily that relationship holds 
>> for a hidden class too.)
>>
>> Point is, it's odd for defineHiddenClass to standardize how a class 
>> loader refers to a hidden class when, conceptually, class loaders are 
>> not meant to "know" about hidden classes.
>>
>> (The connection between a defining loader and a hidden class is a 
>> mere accounting trick done to support the hidden class's own code. No 
>> class loader, not even that defining loader, knows how to respond to 
>> a class load request for the hidden class.)
>>
>> It's especially odd for defineHiddenClass's default to be a strong 
>> reference. That default aligns with ClassLoader::defineClass, the API 
>> we're trying to avoid, and doesn't align with 
>> Unsafe::defineAnonymousClass, the API we're trying to recreate!
>>
>> I understand there are performance reasons to want a loader to use a 
>> strong reference rather than a weak reference. Accepting that claim, 
>> I recommend having the implementation use a weak reference by 
>> default, having the spec allow that, then introducing 
>> ClassOption.STRONG to force a strong reference. That is, specify that:
>>
>> "In the absence of an option, the defining loader's relationship with 
>> the hidden class is unspecified, and the loader implementation may 
>> use a strong reference or a weak reference to keep track of the 
>> hidden class. If a hidden class is not strongly referenced by the 
>> class loader which is deemed to be its defining loader, then the 
>> hidden class can be unloaded when library code no longer refers to 
>> it. Library developers who wish to prevent the hidden class from 
>> being unloaded must ensure that its Class object is never reclaimed, 
>> or else use the ClassOption.STRONG option."
>>
>> I understand there is a concern that developers would not realize / 
>> be surprised by getting a weak reference as the default 
>> implementation. However, the planet-wide audience for 
>> defineHiddenClass is perhaps 500 developers. They already have to 
>> know what they're doing because the features of hidden classes are 
>> already more limited than the features of VM-anonymous classes., 
>> e.g., no constant pool patching. The usual "Java should save 
>> developers from making silly mistakes" rule doesn't apply here.
>>
>> Alex
>



More information about the valhalla-dev mailing list