RFR: 8300926: Several startup regressions ~6-70% in 21-b6 all platforms [v4]
David Holmes
david.holmes at oracle.com
Mon Feb 27 00:20:22 UTC 2023
Answering via email ...
On 25/02/2023 6:11 am, daniel.daugherty at oracle.com wrote:
> On 2/23/23 9:54 PM, David Holmes wrote:
>> On Thu, 23 Feb 2023 12:46:47 GMT, Robbin Ehn<rehn at openjdk.org> wrote:
>>
>>>> I found one call to `add_to_hierarchy()` where we previously did not
>>>> grab in `Compile_lock` in `vmClasses::resolve_shared_class()` and
>>>> that call is made with this assert in place:
>>>> ```assert(!Universe::is_fully_initialized(), "We can make short cuts only during VM initialization");```
>>>>
>>>> so it looks to me like we have a locking issue there (as in too early for locks).
>>> I think you are taking about CDS dump process. It works fine taking the lock.
>>> I think this was just some micro-optimization. But we should not mark and do deopt fixed that.
>> To restate: the assert_locked_or_safepoint is pointless because you just took out the lock here.
>>
>> The code Dan points to does not seem to be related to CDS dump:
>>
>> bool vmClasses::resolve(vmClassID id, TRAPS) {
>> InstanceKlass** klassp = &_klasses[as_int(id)];
>>
>> #if INCLUDE_CDS
>> if (UseSharedSpaces && !JvmtiExport::should_post_class_prepare()) {
>> InstanceKlass* k = *klassp;
>> assert(k->is_shared_boot_class(), "must be");
>>
>> ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
>> resolve_shared_class(k, loader_data, Handle(), CHECK_false);
>> return true;
>> }
>> #endif // INCLUDE_CDS
>>
>> I remain concerned this code may be executed at a safepoint and we will now try to take the Compile_lock.
>>
>> -------------
>>
>> PR:https://git.openjdk.org/jdk/pull/12585
>
> For some reason these comments no longer appear in the current PR.
> That's probably because the code has changed relative to the original
> anchors for the comments so the bots don't know where in the code to
> attach the comments.
Yes it gets very hard to keep track of things.
> In any case, here's the current code that we were talking about (from
> the v05 full webrev):
>
>
> -void SystemDictionary::add_to_hierarchy(InstanceKlass* k) { +void
> SystemDictionary::add_to_hierarchy(JavaThread* current, InstanceKlass*
> k) { assert(k != nullptr, "just checking"); - if
> (Universe::is_fully_initialized()) { -
> assert_locked_or_safepoint(Compile_lock); - } +
> assert(!SafepointSynchronize::is_at_safepoint(), "must NOT be at
> safepoint"); + DeoptimizationScope deopt_scope; + { + MutexLocker
> ml(current, Compile_lock); So the
> "assert_locked_or_safepoint(Compile_lock)" call has been replaced by an
> unconditional: assert(!SafepointSynchronize::is_at_safepoint(), "must
> NOT be at safepoint"); which should trip if
> SystemDictionary::add_to_hierarchy() is ever called from a safepoint
> (with non-release bits). As far as I know, this assert has not fired in
> Robbin's testing.
Okay that partially relieves my concern. Obviously whomever put the
original assert_or_locked did believe/expect it to be called from a
safepoint. It would be good to understand if they were mistaken or
whether things have changed, or whether testing simply isn't catching
that case.
> Also, the code that I was talking about was not "bool
> vmClasses::resolve(vmClassID id, TRAPS)". I was talking about
> "vmClasses::resolve_shared_class()" which is the code that calls this
> assert: assert(!Universe::is_fully_initialized(), "We can make short
> cuts only during VM initialization"); I was worried about this code path
> because its the only place that calls add_to_hierarchy() in the original
> code that _did not_ grab Compile_lock. With Robbin's latest code
> add_to_hierarchy() does grab Compile_lock, but if that was going to be a
> problem, it should have shown up in testing. Dan
Yes and in response to your concern Robbin said that there was no issue
at CDS dump time. I then showed that vmClasses::resolve called
vmClasses::resolve_shared_class() not during CDS dump - hence it was
potentially still a concern.
David
-----
More information about the hotspot-dev
mailing list