RFR: 8028498: runtime/SharedArchiveFile/CdsDifferentObjectAlignment.java asserts in RT_Baseline
Stefan Johansson
stefan.johansson at oracle.com
Mon Mar 31 11:11:31 UTC 2014
Thanks for reviewing Coleen!
Stefan
On 2014-03-28 20:03, Coleen Phillimore wrote:
>
> Stefan,
> This looks good. I thought this got checked in already. I think
> removing gc_locked_out_count is fine for CheckUnhandledOops, since
> you've done the testing and haven't found a use for it. I added it a
> long time ago and the code's changed a lot, so it's nice to clean up.
> Thanks!
> Coleen
>
> On 3/27/14 10:40 AM, Stefan Johansson wrote:
>> I still need a review from someone with reviewer status. Would be
>> good if someone from the runtime team who feels comfortable reviewing
>> the small CheckUnhandledOops changes could have a look.
>>
>> Thanks,
>> Stefan
>>
>> On 2014-03-06 19:35, Stefan Johansson wrote:
>>> As Per noticed the _gc_locked_out_count isn't updated anymore when
>>> removing the GC locker lock/unlock methods. I've looked through the
>>> code to see what would be the proper action to take in
>>> clear_unhandled_oops(). The first observation was that the check for
>>> is_gc_locked_out() only had any effect during a short period of time
>>> during startup (the only place we used GC locker lock/unlock). This
>>> leads to the question, do we need to avoid clearing the unhandled
>>> oops when the GC lockers other lock mechanism is used, and I've look
>>> this through together with Per and it seems like it's not needed.
>>>
>>> One can argue that if we've locked out the GC using the GC locker,
>>> it should be fine to have unhandled oops, but since we don't make
>>> use of that today I see no reason for enabling it. If I haven't
>>> missed anything this should allow us to remove the check from
>>> clear_unhandled_oops() and the _gc_locked_out_count with accessors
>>> all together.
>>>
>>> Please let me know if you have any fears or thoughts around this.
>>> I've run both JPRT tests and some bigapps testing with
>>> +CheckUnhandledOops without any problem as sanity testing.
>>>
>>> Regarding the message I updated it to use the methods suggested by Per.
>>>
>>> Here's the updated webrev:
>>> http://cr.openjdk.java.net/~sjohanss/8028498/webrev.03/
>>>
>>> Thanks,
>>> Stefan
>>>
>>> On 2014-02-17 10:58, Per Liden wrote:
>>>> Stefan,
>>>>
>>>> I think this is a nice fix for the problem and it also cleans up
>>>> the gclocker a bit. But I have a few minor comments:
>>>>
>>>> vmGCOperations.cpp:
>>>> 110 err_msg("GC triggered before VM initialization
>>>> completed. Try increasing "
>>>> 111 "NewSize, current value " UINTX_FORMAT "K.",
>>>> NewSize / K));
>>>>
>>>> I'd suggest you use
>>>> byte_size_in_proper_unit()/proper_unit_for_byte_size() instead of a
>>>> "K", or maybe just not print the size at all.
>>>>
>>>>
>>>> With the removal of GC_locker::lock()/unlock() there's no longer
>>>> anyone how modifies Thread::current()->_gc_locked_out_count. So we
>>>> should be able to remove it. However,
>>>> UnhandledOops::clear_unhandled_oops() still uses is_gc_locked_out()
>>>> so that needs to be changed to check for something else,
>>>> is_init_completed maybe?
>>>>
>>>> cheers,
>>>> /Per
>>>>
>>>> On 02/12/2014 06:12 PM, Stefan Johansson wrote:
>>>>> Hi,
>>>>>
>>>>> Stefan K pointed out to me that in the Metaspace code we use
>>>>> is_init_completed() to verify that the VM is fully initialized. I
>>>>> started looking at where we do set_init_completed() and realized
>>>>> that it
>>>>> is right where we are ready to handle a GC. It makes sense to try to
>>>>> minimize the different ways we check if the VM is fully initialized.
>>>>> Using is_init_completed() instead of the GC locker to prevent GCs
>>>>> during
>>>>> startup has another nice effect too; we can remove one of the two
>>>>> different lock mechanisms in the GC locker.
>>>>>
>>>>> The new proposal removes the use of GC_locker::lock()/unlock()
>>>>> which is
>>>>> only used to prevent GCs during startup. Instead there is a check
>>>>> in the
>>>>> GC operations prologue, to ensure that the VM is initialized when
>>>>> the GC
>>>>> starts.
>>>>>
>>>>> Please review the new the change:
>>>>> http://cr.openjdk.java.net/~sjohanss/8028498/webrev.02/
>>>>>
>>>>> Testing:
>>>>> * JPRT
>>>>> * GC locker test through UTE
>>>>>
>>>>> Thanks,
>>>>> Stefan
>>>>>
>>>>> On 2014-02-11 16:12, Stefan Johansson wrote:
>>>>>> Hi again =)
>>>>>>
>>>>>> Don't spend time on the current webrev (02). I've gotten some more
>>>>>> comments on the proposed fix and will look at a solution that
>>>>>> allow us
>>>>>> to remove the GC locker usage during initialization.
>>>>>>
>>>>>> Cheers,
>>>>>> Stefan
>>>>>>
>>>>>> On 2014-02-10 18:51, Stefan Johansson wrote:
>>>>>>> Hi again,
>>>>>>>
>>>>>>> After a couple of offline discussions with different people I've
>>>>>>> come
>>>>>>> to the conclusion to split out the sizing of the young generation
>>>>>>> from the fix for this issue. I've created a new bug
>>>>>>> (JDK-8033426) for
>>>>>>> that, which is currently out for review.
>>>>>>>
>>>>>>> The discussions also lead to a different approach for fixing this
>>>>>>> issue. The new proposal is to use the GC locker to prevent GCs
>>>>>>> until
>>>>>>> we are ready to handle them and otherwise fail the VM
>>>>>>> initialization.
>>>>>>> The gc locker has two different mechanisms for locking out the GC,
>>>>>>> one which is used during initialization and one used to stall GCs
>>>>>>> when doing critical JNI work. The part of the initialization that
>>>>>>> currently is locked by the GC locker is to narrow and there is no
>>>>>>> guarantee that a GC can be handled after the GC locker is unlocked.
>>>>>>> This fix will extend the part that is locked and also add a check
>>>>>>> that if a GC is initiated while locked during startup the VM exits.
>>>>>>>
>>>>>>> New webrev:
>>>>>>> http://cr.openjdk.java.net/~sjohanss/8028498/webrev.01/
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Stefan
>>>>>>>
>>>>>>> On 2014-01-29 14:54, Stefan Johansson wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> Please review this fix for:
>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8028498
>>>>>>>>
>>>>>>>> Webrev:
>>>>>>>> http://cr.openjdk.java.net/~sjohanss/8028498/webrev.00/
>>>>>>>>
>>>>>>>> Summary:
>>>>>>>> The initial young generation size has been fairly small by default
>>>>>>>> (1.5M) and if setting ObjectAlignmentInBytes to something larger
>>>>>>>> than the default it can causes CDS to trigger a GC when dumping
>>>>>>>> the
>>>>>>>> archive. At this point the VM is not ready to handle a GC and we
>>>>>>>> will hit an assertion. Making sure we can handle a GC at this
>>>>>>>> point
>>>>>>>> is not trivial and the proposed solution is to alter the default
>>>>>>>> sizing of the young generation as well as adding a safety check
>>>>>>>> when
>>>>>>>> dumping the archive to exit the VM if the young generation is too
>>>>>>>> small.
>>>>>>>>
>>>>>>>> Testing:
>>>>>>>> * JPRT build and test passes
>>>>>>>> * Failing test now passes on all platforms (tested throught JPRT)
>>>>>>>> * Verified that the GC and Runtime jtreg tests still passes
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> Stefan
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
More information about the hotspot-dev
mailing list