[RESUMED] RFR: 8158946 - btree009 fails with assert(s > 0) failed: Bad size calculated

Derek White derek.white at oracle.com
Wed Jun 22 18:34:48 UTC 2016

Hi Thomas,

Thanks for the comments! Questions below...

On 6/22/16 12:10 PM, Thomas Schatzl wrote:
> Hi,
> On Tue, 2016-06-21 at 22:07 -0400, Kim Barrett wrote:
>>> On Jun 21, 2016, at 6:36 PM, Thomas Schatzl <thomas.schatzl at oracle.
>>> com> wrote:
>>> Hi,
>>> On Tue, 2016-06-21 at 18:27 -0400, Derek White wrote:
>>>> Here's a more complete solution to the problem.
>>>> As Kim mentioned, the new version sets the object size field of
>>>> a
>>>> java.lang.Class object before it sets the object's header, so GC
>>>> can
>>>> reliably get the size of any object with it's header set.
>>>    just briefly looking over the code (maybe I am overlooking
>>> something
>>> obvious, I am only looking at the webrev) - wouldn't the code need
>>> some
>>> compiler and memory barriers that make sure that this required
>>> read/write orderings are observed?
>> I agree with Thomas.  I think there needs to be an
>> OrderAccess::storestore() between the setting of the size and the
>> setting of the klass.
> Also the reader thread needs barriers.
>> And that makes me wonder why
>> CollectedHeap::post_allocation_setup_array doesn't appear to have
>> a similar store barrier.  It even has the corresponding comment about
>> how the array length must be set before setting the _klass field so
>> the object is parsable by concurrent GC.
>> Maybe this only causes problems when the object is allocated in the
>> old gen (perhaps because it is large).  Is there some other path for
>> large arrays, so we don't have a barrier for every array allocation?
>> I hope I'm missing something...
> I do not know for CMS, but G1's humongous objects do have a storestore
> barrier at the correct place (and it should have the corresponding at
> the reader side). These are the only direct old gen allocations G1 ever
> does.
Where is this barrier used? I thought the header setting was done up at 
CollectedHeap::array_allocate(), outside of G1 code?
> In any case, as soon as CMS uses this method for old gen allocation, it
> needs to have the necessary barriers (obviously).

I think for CMS, reading and writing are protected by the 
cms_space->freelistLock(). For example,
the CMS sweeper holds the freelistLock. The Java thread trying to 
allocate requests, then gets the freelistLock(), and the sweeper 
re-aquires the freelistLock() before resuming the sweep (and reading).

So I'd think that there are plenty of fences for CMS?

  - Derek
> It seems that in CMS, the threshold to use a direct old gen allocation
> is pretty high, i.e. object_size > young-gen-capacity, so really really
> seldom (in GenCollectorPolicy::should_try_older_generation_allocation)
> (or if the gc locker is active).
>>>> This fix works by adding a CollectedHeap::class_allocate() method
>>>> and
>>>> associated helpers. These are implemented in
>>>> CollectedHeap.inline.hpp
>>>> only because they share so much structure and code with
>>>> CollectedHeap::obj_allocate() that I thought it best to keep
>>>> them
>>>> together (even though there is no performance reason to have the
>>>> new
>>>> code inlined).
>>>> Webrev: http://cr.openjdk.java.net/~drwhite/8158946/webrev.02
>>>> jprt in progress...
> Thanks,
>    Thomas

More information about the hotspot-gc-dev mailing list