RFR: 8065634: Crash in InstanceKlass::clean_method_data when _method is NULL

Stefan Karlsson stefan.karlsson at oracle.com
Fri Dec 5 13:59:57 UTC 2014


Hi Poonam,

Thanks for reviewing.

On 2014-12-04 17:19, Poonam Bajaj Parhar wrote:
> Hello Stefan,
>
> The changes look good to me.
>
> Perhaps the comment for the following code can be modified from:
>
> 3132     // The annotations below has been transfered the 
> _combined_annotations
> 3133     // so these fields can now be cleared.
> 3134     _annotations             = NULL;
> 3135     _type_annotations        = NULL;
> 3136     _fields_annotations      = NULL;
> 3137     _fields_type_annotations = NULL;
> 3138 }
>
> to
>
> 3132     // The annotations arrays below have been transferred to the 
> _combined_annotations

I'll change the comment before pushing.

>
> Also, if possible, would be good if we can change the name of 
> _annotations field to _class_annotations; more like the names of the 
> other annotations arrays.

It's a good suggestion, but that change itself is around two times 
larger in the number of changed lines, so I don't want to do it as a 
part of this bug fix. I've created the following bug:
https://bugs.openjdk.java.net/browse/JDK-8066774

Thanks,
StefanK

>
> Thanks,
> Poonam
>
>
> On 12/4/2014 5:25 AM, harold seigel wrote:
>> Hi,
>>
>> How about adding an 'else' statement at line 4342?  That would make 
>> the code consistent with the comments at lines 4329-4330 and 4343-4344.
>>
>> 4328   if (_combined_annotations != NULL) {
>> 4329     // After all annotations arrays have been created, they are 
>> installed into the
>> 4330     // Annotations object that will be assigned to the 
>> InstanceKlass being created.
>> 4331
>> 4332     // Deallocate the Annotations object and the installed 
>> annotations arrays.
>> 4333 _combined_annotations->deallocate_contents(_loader_data);
>> 4334
>> 4335     // If the _combined_annotations pointer is non-NULL,
>> 4336     // then the other annotations fields should have been cleared.
>> 4337     assert(_annotations             == NULL, "Should have been 
>> cleared");
>> 4338     assert(_type_annotations        == NULL, "Should have been 
>> cleared");
>> 4339     assert(_fields_annotations      == NULL, "Should have been 
>> cleared");
>> 4340     assert(_fields_type_annotations == NULL, "Should have been 
>> cleared");
>> 4341   }
>> 4342
>> 4343   // If the annotations arrays were not installed into the 
>> Annotations object,
>> 4344   // then they have to be deallocated explicitly.
>> 4345   MetadataFactory::free_array<u1>(_loader_data, _annotations);
>> 4346   MetadataFactory::free_array<u1>(_loader_data, _type_annotations);
>> 4347   Annotations::free_contents(_loader_data, _fields_annotations);
>> 4348   Annotations::free_contents(_loader_data, 
>> _fields_type_annotations);
>>
>> Thanks, Harold
>>
>> On 12/3/2014 4:36 PM, Coleen Phillimore wrote:
>>>
>>> On 12/3/14, 2:31 PM, harold seigel wrote:
>>>> Hi Stefan,
>>>>
>>>> The change looks good but I have a couple of questions.
>>>>
>>>> 1. Why does the call to create_combined_annotations(), in 
>>>> parseClassFile(), use CHECK_NULL when other calls use 
>>>> CHECK_(nullHandle) ?
>>>>
>>>> 4021     ClassAnnotationCollector parsed_annotations;
>>>> 4022     parse_classfile_attributes(&parsed_annotations, 
>>>> CHECK_(nullHandle));
>>>> 4023
>>>> 4024     // Finalize the Annotations metadata object,
>>>> 4025     // now that all annotation arrays have been created.
>>>> 4026     create_combined_annotations(CHECK_NULL);
>>>> 4027
>>>> 4028     // Make sure this is the end of class file stream
>>>> 4029     guarantee_property(cfs->at_eos(), "Extra bytes at the end 
>>>> of class file %s", CHECK_(nullHandle));
>>>
>>> Oh, this is my fault. https://bugs.openjdk.java.net/browse/JDK-8066624
>>> If it looks inconsistent, maybe it can be changed to 
>>> CHECK_(nullHandle);
>>>>
>>>>
>>>> 2. In ~ClassFileParser(), does MetadataFactory::free_array() and 
>>>> Annotations::free_contents() need to be called if the *_annotation 
>>>> fields are NULL?
>>>
>>> free_array() checks for null and is inlined so there isn't another 
>>> need for checking if the Array is null first.
>>>
>>> This change looks good to me.
>>>
>>> Coleen
>>>>
>>>>
>>>> Thanks, Harold
>>>>
>>>> On 12/3/2014 9:21 AM, Stefan Karlsson wrote:
>>>>> Hi all,
>>>>>
>>>>> Please, review this patch to fix an issue where the GC encounters 
>>>>> an InstanceKlass before it has come far enough in the class 
>>>>> loading process.
>>>>>
>>>>> Some background to the fix:
>>>>>
>>>>> When the JVM loads classes it has to keep track of the allocated 
>>>>> Metadata, and in the event of an exception deallocate the 
>>>>> Metadata. The ClassFileParser saves the Metadata pointers so that 
>>>>> it knows what needs to be deallocated. When the class loading has 
>>>>> come far enough there's a point were the GC can take over the 
>>>>> ownership of the Metadata and do deallocation of the both the 
>>>>> InstanceKlass and the Metadata, if needed. At that point the 
>>>>> Metadata pointers in the ClassFileParser are cleared and 
>>>>> transfered over to the InstanceKlass.
>>>>>
>>>>> Most Metadata allocations happen before the InstanceKlass is 
>>>>> allocated, but the Annotations are allocated after the 
>>>>> InstanceKlass but before the transferal and clearing of the 
>>>>> Metadata pointers in the ClassFileParser. If the GC stops when 
>>>>> allocating the Annotations, it will likely find this InstanceKlass 
>>>>> and assume that the Metadata are correctly setup. This is exactly 
>>>>> what's happening in the bug report. The GC finds that the _methods 
>>>>> array, unexpectedly, points to NULL.
>>>>>
>>>>> The proposed solution to this problem is to allocate the 
>>>>> Annotations before the InstanceKlass is allocated.
>>>>>
>>>>> http://cr.openjdk.java.net/~stefank/8065634/webrev.01
>>>>> https://bugs.openjdk.java.net/browse/JDK-8065634
>>>>>
>>>>> Testing:
>>>>> JPRT, parallel_class_loading testlist, Aurora adhoc run
>>>>>
>>>>> Thanks,
>>>>> StefanK
>>>>
>>>
>>
>



More information about the hotspot-dev mailing list