RFR (S): 8197844: JVMTI GetLoadedClasses should use the Access API

Erik Österlund erik.osterlund at oracle.com
Fri Feb 23 09:26:52 UTC 2018


Hi Coleen,

Sure, go ahead. Looking forward to seeing your solution.

Thanks,
/Erik

On 2018-02-15 17:16, coleen.phillimore at oracle.com wrote:
>
> Hi Erik,
>
> I wanted to fix this differently and I don't like that Klass is a 
> friend of ClassLoaderData especially.
>
> The patch in jvmtiGetLoadedClasses.cpp was a minimal patch which is 
> easy for backporting, but in discussions with Kim and Stefan, I think 
> the problem is larger.  When we iterate through ClassLoaderDataGraph 
> we don't want any of the loaders to get unlinked if there's a 
> safepoint in the function or closure that we call, or else the list 
> will get broken.  I don't think we do that now but we should guard 
> against it.  I think the CLDG iterator should have the barrier on the 
> holder, which is good because then it doesn't have to be friends with 
> itself.  We have a bunch of ad-hoc iteration of the graph which should 
> be unified into an iterator.
>
> I'd like to work on a different patch if that is ok with you.
>
> Thanks,
> Coleen
>
> On 2/15/18 5:04 AM, Erik Österlund wrote:
>> Hi,
>>
>> The JVMTI GetLoadedClasses function retrieves, as the name suggests, 
>> all loaded classes. However, to be able to safely return their 
>> mirrors in handles during potential concurrent marking, G1 requires 
>> an SATB enqueue barrier to shade these mirrors grey that were not 
>> part of the snapshot at the beginning, to prevent the classes from 
>> being unloaded.
>>
>> The current solution is to explicitly SATB enqueue the mirror of the 
>> retrieved classes with the usual #ifdef blah if (UseG1GC) jazz.
>>
>> My proposed solution is to instead use the Access API to make the 
>> code more modular. In the Access API, this operation corresponds to 
>> loading the mirror with ON_PHANTOM_OOP_REF. Also, an observation from 
>> my part is that usually when we keep classes from unloading, we keep 
>> the klass_holder alive, rather than the mirror. For all Klasses 
>> except anonymous instanceKlasses, the holder is the class loader. For 
>> anonymous instanceKlasses, the holder is the mirror. As the rest of 
>> the code tends to prevent class unloading by keeping the holder 
>> alive, I would prefer to keep the holder alive instead of the mirror, 
>> unless there is a good reason to keep the mirror alive instead of the 
>> holder.
>>
>> Bug:
>> https://bugs.openjdk.java.net/browse/JDK-8197844
>>
>> Webrev:
>> http://cr.openjdk.java.net/~eosterlund/8197844/webrev.00/
>>
>> This change has made it through hs-tier1-5 and jdk-tier1-3.
>>
>> Thanks,
>> /Erik
>



More information about the hotspot-runtime-dev mailing list