RFR: 8247879: Rework WeakHandle and OopHandle to dynamically support different OopStorages

Erik Österlund erik.osterlund at oracle.com
Mon Jun 22 15:05:00 UTC 2020


Hi Stefan,

I really like the direction of this work. Tiny nit:
In oopHandle.hpp maybe include oopsHierarchy.hpp instead of forward 
declaring class oop; Because in product builds it won't be a class, it 
will be an oopDesc*, so not sure how happy compilers are with that 
forward declaration not matching the type.

Otherwise, looks good to me.

Thanks,
/Erik

On 2020-06-22 14:12, Stefan Karlsson wrote:
>
> On 2020-06-19 17:56, coleen.phillimore at oracle.com wrote:
>>
>> https://cr.openjdk.java.net/~stefank/8247879/webrev.01/src/hotspot/share/classfile/classLoaderData.hpp.udiff.html 
>>
>>
>> + WeakHandle _holder; // The oop that determines lifetime of this 
>> class loader
>> + OopHandle _class_loader; // The instance of java/lang/ClassLoader 
>> associated with
>> + // this ClassLoaderData
>>
>>
>> Can you line the member names up?
>>
>>
>> On 6/18/20 6:09 PM, Stefan Karlsson wrote:
>>> Hi all,
>>>
>>> Please review this patch to rework WeakHandle and OopHandle to 
>>> dynamically support different OopStorages.
>>>
>>> https://cr.openjdk.java.net/~stefank/8247879/webrev.01/
>>> https://bugs.openjdk.java.net/browse/JDK-8247879
>>>
>>> Today WeakHandle has a template parameter and specialization of 
>>> get_storage() to get hold of the backing OopStorage. Coleen, ErikÖ 
>>> and I talked about different ways to rewrite that, so that we 
>>> wouldn't have to write specializations for all weak oop storages, 
>>> and so that we don't have to carry around the type information about 
>>> the weak oop storage.
>>>
>>> Instead of writing:
>>> WeakHandle<vm_weak_data> w = WeakHandle<vm_weak_data>::create(obj)
>>>
>>> we could instead write:
>>> WeakHandle w(OopStorageSet::vm_weak(), obj)
>>>
>>> OopHandle is today hard-coded to use OopStorageSet::vm_global(). The 
>>> proposal is to change OopHandle to look like WeakHandle, and allow 
>>> more than one OopStorage. Something that might will become important 
>>> going forward, when we are going to move more things into separate 
>>> OopStorages.
>>>
>>> So, instead of writing:
>>> OopHandle h = OopHandle::create(obj)
>>>
>>> one will have to specify the OopStorage explicitly:
>>> OopHandle h(OopStorageSet::vm_global(), obj)
>>>
>>> This change has a slight drawback that the OopStorage used for the 
>>> allocation of the handle, needs to be provided when the handle is 
>>> released.
>>>
>>> To make this safer, so that you don't use strong OopStorages when 
>>> allocating WeakHandles, or weak OopStorages when allocating 
>>> OopHandles, I've created two subclasses to OopStorage: 
>>> StrongOopStorage and WeakOopStorage. They are just two tiny wrappers 
>>> around OopStorage, to allow us ensure correct usage during compile 
>>> time. The oopStorageSet.hpp files seems to be intentionally written 
>>> to *not* know about the OopStorage implementation. To do proper 
>>> casting of the OopStorage*s I need to include the definition of 
>>> StrongOopStorage and WeakOopStorage. I've therefore moved all 
>>> OopStorageSet::<name_of_oop_storage>() getters out to an inline 
>>> header. This adds a lot of new includes. If we don't think that it's 
>>> important to inline these, then I can move it over to the cpp file 
>>> instead.
>>
>> I don't like these includes.  In the places where we allocate and 
>> release OopHandle/WeakHandles, where we need to refer to these 
>> storages, performance isn't important to avoid a call.  I don't know 
>> about all of the GC places.
>>
>> I also don't see a large benefit to type safety that these new 
>> classes provide, to be honest, since there aren't many call sites 
>> where we create and release these handles.  We're more likely to mix 
>> different strong oop storages (allocate from one and release from 
>> another), once we have more than one strong OopStorage. 
>> OopStorage::release has a check that the memory is in that storage (I 
>> hope), so there already should be a runtime check.
>>
>> I'll defer to whatever Kim thinks though.  This doesn't seem worth 
>> having to me though.
>>
>> Otherwise, the changes look good.
>
> I reverted all the Strong/Weak designations. Is this OK?:
> https://cr.openjdk.java.net/~stefank/8247879/webrev.02
>
> StefanK
>
>>
>> thanks,
>> Coleen
>>>
>>> Thanks,
>>> StefanK
>>>
>>



More information about the hotspot-dev mailing list