RFR (M) 8249768: Move static oops and NullPointerException oops from Universe into OopStorage

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Wed Jul 22 13:13:41 UTC 2020



On 7/22/20 8:42 AM, David Holmes wrote:
> On 22/07/2020 9:50 pm, coleen.phillimore at oracle.com wrote:
>> On 7/22/20 2:32 AM, David Holmes wrote:
>>> Hi Coleen,
>>>
>>> On 22/07/2020 12:19 am, coleen.phillimore at oracle.com wrote:
>>>>
>>>>
>>>> On 7/20/20 10:47 PM, David Holmes wrote:
>>>>> Hi Coleen,
>>>>>
>>>>> cc'ing serviceability due to SA changes.
>>>>>
>>>>> On 21/07/2020 6:53 am, coleen.phillimore at oracle.com wrote:
>>>>>> Summary: Move static oops into OopStorage and make NPE oops an 
>>>>>> objArrayOop.
>>>>>>
>>>>>> I've broken up moving oops in Universe to OopStorage into several 
>>>>>> parts.  This change moves the global static oops. These 
>>>>>> OopHandles are not released.
>>>>>
>>>>> Overall looks good. But two things ...
>>>>>
>>>>> 1. naming
>>>>>
>>>>> !   // preallocated error objects (no backtrace)
>>>>> !   static OopHandle    _out_of_memory_error;
>>>>>
>>>>>     // array of preallocated error objects with backtrace
>>>>> !   static OopHandle _preallocated_out_of_memory_error_array;
>>>>>
>>>>> Both of these are pre-allocated arrays of OopHandles, differing 
>>>>> only in whether the underlying OOME has a backtrace or not. I find 
>>>>> the newly introduced _out_of_memory_error unclear in that regard. 
>>>>> At a minimum could _out_of_memory_error become 
>>>>> _out_of_memory_errors ? But ideally can we name these two arrays 
>>>>> in a more distinguishable way?
>>>>
>>>> I put this code in functions next to each other because it was 
>>>> confusing.  The _out_of_memory_error array is really preallocated 
>>>> throwables, that are used to fill in the message for 
>>>> preallocated_out_of_memory_errors if there are enough of the latter 
>>>> left.
>>>> I could rename _out_of_memory_error => 
>>>> _out_of_memory_error_throwables  ?
>>>
>>> That doesn't really help. As I said both of these variables are 
>>> arrays of pre-allocated OOME instances (which are throwables) - the 
>>> only difference is one set is single-use (as it can have its 
>>> backtrace set) while the other is reusable. The existing variable
>>>
>>> _preallocated_out_of_memory_error_array
>>>
>>> tells you clearly it is an array of preallocated OOME instances (but 
>>> doesn't saying anything about the backtrace or being single-use). 
>>> The problem is that that is exactly what _out_of_memory_error is as 
>>> well, but the name _out_of_memory_error doesn't convey that it is an 
>>> array, nor that anything is pre-allocated (and also nothing about 
>>> backtraces or re-usability). So given we now have two arrays of 
>>> extremely similar things, it would be clearer to give these clearer 
>>> names. If we want to keep the existing
>>>
>>> _preallocated_out_of_memory_error_array
>>>
>>> name, then the new array should indicate how it differs e.g.
>>>
>>> _reusable_preallocated_out_of_memory_error_array
>>> What do you think?
>>
>> This confuses me more than the code does.  Which array is this? This 
>> is a terrible name for whichever one it is (I guess the original 
>> _out_of_memory_error).  I don't think it's interesting to have the 
>> name _array in it, but being plural does tell you what it is, like 
>> _out_of_memory_errors.
>
> Yes at least being plural is essential to realize it is actually an 
> array.
>
>>   The implementation is a bit weird and some long name isn't going to 
>> help anyone.  The abstraction that this is _out_of_memory_errors is 
>> all anyone outside this implementation needs to know.
>
> My point, which is obviously not getting across, is that you now have 
> two arrays of these out-of-memory-errors that are almost identical, 
> except one is used for one purpose and one used for another, but the 
> variable names don't give you any clue about this.

I actually understand this, but the suggested names don't help.  You 
really need to look at the code and the comments in universe.hpp to see 
the distinction. I don't think we can provide more illumination with 
long names.  Since I moved the functions next to each other, it makes 
more sense when one reads it.

>
> But lets' just add the 's' and move on. :)

Thanks,  I added the 's' and fixed the formatting.  Thank you for 
reviewing this.
Coleen

>
> Cheers,
> David
> -----
>
>>>
>>> I also spotted a minor nit:
>>>
>>>  187 oop      Universe::system_thread_group()          { return 
>>> _system_thread_group.resolve(); }
>>>  188 void Universe::set_system_thread_group(oop group) { 
>>> _system_thread_group = OopHandle(vm_global(), group); }
>>>
>>> Extra spaces after oop on L187.
>>
>> Ok I'll fix the spacing.
>> Thanks,
>> Coleen
>>>
>>> Thanks,
>>> David
>>> -----
>>>
>>>>>
>>>>> 2. SA
>>>>>
>>>>> You've simply deleted all the SA/vmstructs code that referenced 
>>>>> the oops that are no longer present. Does the SA not care about 
>>>>> these things and need access to them? (I don't know hence cc to 
>>>>> serviceability folk.)
>>>>
>>>> Yes, the SA code was never used, so I deleted it.  SA might need in 
>>>> oop inspection to add walking Universe::vm_global() OopStorage area 
>>>> to find where oops come from if there's an error but there doesn't 
>>>> seem to be any other reason for SA to use these oops.
>>>>
>>>> Thanks,
>>>> Coleen
>>>>
>>>>>
>>>>> Thanks,
>>>>> David
>>>>> -----
>>>>>
>>>>>> This has been tested with tier1-3 and on also remote-build -b 
>>>>>> linux-arm32,linux-ppc64le-debug,linux-s390x-debug,linux-x64-zero.
>>>>>>
>>>>>> open webrev at 
>>>>>> http://cr.openjdk.java.net/~coleenp/2020/8249768.01/webrev
>>>>>> bug link https://bugs.openjdk.java.net/browse/JDK-8249768
>>>>>>
>>>>>> Thanks,
>>>>>> Coleen
>>>>
>>



More information about the hotspot-dev mailing list