Prepare for verification?

Jon Masamitsu jon.masamitsu at oracle.com
Wed Aug 20 16:43:49 UTC 2014


prepare_for_verify() was needed by CMS, partly, because CMS could
have dead objects in the CMS generation after the collection.  I think
it was needed with the VerifyDuringGC for CMS.  There was something
like a scan of the CMS generation to check that all the objects on the
freelists were dead and objects not on the freelists were live.  The
prepare_for_verify() is not optional.

The linear allocation blocks were used for perm gen allocation.
Maybe also for the initial allocations from the cms gen.  Linear
allocation blocks are allocated from the cms gen and then
objects are allocated from them by pointer bumps.  Generally
the coalescing of the free blocks isn't good enough to get
contiguous chunks of space big enough for the linear
allocation blocks.  Don't recall why they need to be
fixed up for verification.  Maybe filler objects had to be
inserted.

Jon


On 8/20/2014 7:23 AM, Jesper Wilhelmsson wrote:
> Hi,
>
> When removing the generations array I ran in to the following question.
>
> In GenCollectedHeap::do_collection() there is this code:
>
> if (VerifyBeforeGC && i >= VerifyGCLevel &&
>     total_collections() >= VerifyGCStartAt) {
>   HandleMark hm;  // Discard invalid handles created during verification
>   if (!prepared_for_verification) {
>     prepare_for_verify();
>     prepared_for_verification = true;
>   }
>   Universe::verify(" VerifyBeforeGC:");
> }
>
> Note that we make sure to run prepare_for_verify() before calling 
> Universe::verify().
>
> Later there is this code:
>
> if (VerifyAfterGC && i >= VerifyGCLevel &&
>     total_collections() >= VerifyGCStartAt) {
>   HandleMark hm;  // Discard invalid handles created during verification
>   Universe::verify(" VerifyAfterGC:");
> }
>
> Here we do not prepare for verification.
>
>
> Now, what happens if we run with VerifyBeforeGC=false and 
> VerifyAfterGC=true?
>
> As far as I can see, only CMS has an implementation for 
> prepare_for_verify(), where it does things like 
> CompactibleFreeListSpace::repairLinearAllocationBlocks()
>
> I have been playing around with CMS trying to provoke something here 
> but I can't say that I understand the linear allocation blocks well 
> enough to know how to create a potentially bad situation. Could there 
> be a problem here or is the preparation before verification voluntary?
>
> Since I'm rewriting this code slightly I need to know if I should 
> preserve this behavior or make sure that we have prepared in the after 
> GC case as well.
>
> Thanks,
> /Jesper



More information about the hotspot-gc-dev mailing list