RFR 8029178: Parallel class loading test anonymous-simple gets SIGSEGV in Metaspace:,:contains

Coleen Phillmore coleen.phillimore at oracle.com
Fri Jan 3 04:57:40 PST 2014


Mikael,

Thanks for reviewing the code.  See below.

On 1/3/2014 4:31 AM, Mikael Gerdin wrote:
>
> Coleen,
>
> On Thursday 02 January 2014 12.25.25 Coleen Phillmore wrote:
>
> > Summary: Metaspace::contains cannot look at purged metaspaces while CMS
>
> > concurrently deallocates them.
>
> >
>
> > Removed 2 calls to is_metaspace_object where the object may be in a
>
> > deallocated metaspace. Removed walking virtual space lists for
>
> > determining contains because the virtual space list can change
>
> > concurrently with the walk. CLDG::contains is slower but no slowdowns
>
> > with testing were observed.
>
> >
>
> > Tested by SQE testbase tests, jtreg tests. Functional testing by
>
> > parallel class loading tests and nsk/coverage/arguments/arguments008
>
> > (ie. calls Method::is_valid_method)
>
> >
>
> > open webrev at http://cr.openjdk.java.net/~coleenp/8029178/
>
> --- old/src/share/vm/code/dependencies.cpp 2014-01-02 
> 12:04:06.325014397 -0500
>
> +++ new/src/share/vm/code/dependencies.cpp	2014-01-02 12:04:05.877014397 -0500
> @@ -655,8 +655,6 @@
>     } else {
>       o = _deps->oop_recorder()->metadata_at(i);
>     }
> -  assert(o == NULL || o->is_metaspace_object(),
> -         err_msg("Should be metadata " PTR_FORMAT, o));
>     return o;
>   }
>
> Why did you remove only this call to is_metaspace_object and no other?
>
> This and none of the other callers of is_metaspace_object seem to be 
> in any hot path so I agree with your assessment that this should not 
> be a performance issue.
>

This one is called indirectly by flush_dependencies so could be called 
for unloaded metaspaces.  I hadn't removed any to start out.
>
>
> It seems to me that the core of the change is to not check the 
> _unloading list in CLDG::contains and then change all calls to go 
> through CLDG::contains, the CLD and then the SpaceManagers and Chunks, 
> that seems like a reasonable approach.
>
> I like that you put CLDG::contains in PRODUCT in os::print_location!
>

Yes, this could be improved to ask is_valid_method or 
is_valid_constant_pool or the other metadata objects and call print, but 
many metaspace objects don't have vtables, so we'd have to check directly.

> The old code incorrectly calls the static Metaspace::contains for each 
> CLD in CLDG::contains but calls it like metaspace_or_null->contains(x) 
> so it's not strange that it was found to be slow :)
>

Yes, the old code was wrong and so one of them had to go.

Thanks,
Coleen

> /Mikael
>
> > bug link https://bugs.openjdk.java.net/browse/JDK-8029178
>
> >
>
> > Thanks,
>
> > Coleen
>



More information about the hotspot-dev mailing list