RFR 8165246: [REDO] InstanceKlass::_previous_version_count goes negative

Coleen Phillimore coleen.phillimore at oracle.com
Wed Sep 7 18:57:04 UTC 2016

Hi Serguei,  Thank you for reviewing also.

On 9/7/16 2:52 PM, serguei.spitsyn at oracle.com wrote:
> Hi Coleen,
> I saw the review comments from George and Dan and so, do not touch 
> this ground.
> The fix looks good in general but I have a couple of comments.
> The _has_previous_versions being a static field looks a bit dangerous 
> to me,
> but it is probably Ok as the function has_previous_versions() is 
> called only
> in one place in the do_unloading which then will recalculate the filed 
> value.

The renaming makes me feel better about it.
> src/share/vm/oops/instanceKlass.cpp
> 3389 void InstanceKlass::purge_previous_version_list() {
> 3390 assert(SafepointSynchronize::is_at_safepoint(), "only called at 
> safepoint");
> 3391 assert (has_been_redefined(), "Should only be called for main 
> class");
> 3392
> 3393 if (previous_versions() != NULL) { . . . 3476   }
>   Nit: I'd suggest to replace the 3393+3476 with:
> if (previous_versions() == NULL) { return; } 
Okay.  I can change it to have an early exit and re-indent.   It might 
be easier to understand that way. thanks, Coleen
>   It will simplify the code by reducing the nesting level and 
> indentation. Thanks, Serguei On 9/6/16 09:24, Coleen Phillimore wrote:
>> Summary: make _has_previous_version a boolean that is set to true 
>> when previous version of a class is added or during class unloading 
>> call to purge_previous_versions The failed fix was because 
>> InstanceKlass's previous_versions klasses were walked more than once 
>> during class unloading, because the scratch classes are also on the 
>> CLD::_klasses list.  This change does three things.  1. Only walk the 
>> class if has_been_redefined (which is not set for the scratch class), 
>> 2. set next link to NULL for the scratch class when removed from the 
>> previous version list, and 3. change the counter to a flag because 
>> the counter may never go to zero if a CLD has redefined classes with 
>> previous versions and is unloaded.  For this latter case we don't 
>> need to walk previous_versions. I tested this with changes 1 and 2 in 
>> Kitchensink, to verify the diagnosis, and then added 3 and retested. 
>> Also tested with the fix for 
>> https://bugs.openjdk.java.net/browse/JDK-8156137 which was checked 
>> into hs_-omp repository. Also ran through RBT 4 tiers nightly tests. 
>> open webrev at http://cr.openjdk.java.net/~coleenp/8165246.01/webrev 
>> bug link https://bugs.openjdk.java.net/browse/JDK-8165246 Thanks, Coleen 

More information about the hotspot-runtime-dev mailing list