RFR JDK-8206394 : ResourceMark in AOTCompiledMethod::metadata_do, AOTCompiledMethod::clear_inline_caches , CompiledMethod::clear_ic_stubs , CompiledMethod::cleanup_inline_caches_impl - was : RE: ResourceMarks when CompiledIC_at is used ?
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Thu Jul 5 17:29:57 UTC 2018
Some ResourceMarks are missing because they might clear other resource
allocated memory when they return. This usually occurs with the
print_on(outputStream*) methods because logStream or stringStream may be
expanded in the print function and you don't want it cleared on return.
There may also be a ResourceMark further up the call chain for these
cases. So you have to be careful with this.
On 7/5/18 12:18 PM, Baesken, Matthias wrote:
> Great , thanks for your help !
>
>
> Btw. while looking a bit more at the ResourceMark usages , I found that the name_and_sig_as_C_string() calls are mostly
> in the codebase with a related ResourceMark .
>
> However it is not done always, for example ; do you think it is missing at these places or not needed?
>
>
> hotspot/share/classfile/verifier.cpp#626
>
> 623void ClassVerifier::verify_method(const methodHandle& m, TRAPS) {
> 624 HandleMark hm(THREAD);
The HandleMark is probably not needed here though. A ResourceMark does
seem like a good idea here.
Coleen
> 625 _method = m; // initialize _method
> 626 log_info(verification)("Verifying method %s", m->name_and_sig_as_C_string());
>
>
> hotspot/share/classfile/classLoader.cpp#2045
>
> void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
>
> 2058 if (HAS_PENDING_EXCEPTION) {
> 2059 clear_pending_exception_if_not_oom(CHECK);
> 2060 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
> 2061 } else {
> 2062 _compile_the_world_method_counter++;
> 2063 }
> 2064 }
> 2065 } else {
> 2066 tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
> 2067 }
>
> Best regards, Matthias
>
>
>
>> -----Original Message-----
>> From: Vladimir Kozlov [mailto:vladimir.kozlov at oracle.com]
>> Sent: Donnerstag, 5. Juli 2018 18:07
>> To: Baesken, Matthias <matthias.baesken at sap.com>; 'hotspot-
>> dev at openjdk.java.net' <hotspot-dev at openjdk.java.net>
>> Subject: Re: RFR JDK-8206394 : ResourceMark in
>> AOTCompiledMethod::metadata_do,
>> AOTCompiledMethod::clear_inline_caches ,
>> CompiledMethod::clear_ic_stubs ,
>> CompiledMethod::cleanup_inline_caches_impl - was : RE: ResourceMarks
>> when CompiledIC_at is used ?
>>
>> Looks good. I will test it and push if it passed.
>>
>> Thanks,
>> Vladimir
>>
>> On 7/5/18 2:14 AM, Baesken, Matthias wrote:
>>> Hi Vladimir, thanks for looking into it !
>>>
>>> Please review :
>>>
>>> http://cr.openjdk.java.net/~mbaesken/webrevs/8206394/
>>>
>>>
>>> https://bugs.openjdk.java.net/browse/JDK-8206394
>>>
>>>
>>> Best regards, Matthias
>>>
>>>
>>>
>>>> -----Original Message-----
>>>> From: Vladimir Kozlov [mailto:vladimir.kozlov at oracle.com]
>>>> Sent: Mittwoch, 4. Juli 2018 19:43
>>>> To: Baesken, Matthias <matthias.baesken at sap.com>; 'hotspot-
>>>> dev at openjdk.java.net' <hotspot-dev at openjdk.java.net>
>>>> Subject: Re: ResourceMarks when CompiledIC_at is used ?
>>>>
>>>> Thank you, Matthias
>>>>
>>>> Yes, I checked all these places and they have to be fixed. Please, file
>>>> a bug for jdk11.
>>>>
>>>> Vladimir
>>>>
>>>> On 7/4/18 7:44 AM, Baesken, Matthias wrote:
>>>>> Hello, I recently looked at 8164293: HotSpot leaking memory in long-
>>>> running requests
>>>>> http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/rev/8dfbb002197a
>>>>>
>>>>> where a number of missing ResourceMarks were added .
>>>>> I think some of those ResourceMarks were added because of
>>>> CompiledIC_at in the changed functions .
>>>>> I checked for other CompiledIC_at in the hs coding , and found some
>>>> other places (see below) where ResourceMarks are missing as well.
>>>>> Should they be added ?
>>>>>
>>>>> Best regards, Matthias
>>>>>
>>>>>
>>>>>
>>>>> src/hotspot/share/aot/aotCompiledMethod.cpp
>>>>>
>>>>> void AOTCompiledMethod::metadata_do(void f(Metadata*)) {
>>>>> .....
>>>>> 274 } else if (iter.type() == relocInfo::virtual_call_type) {
>>>>> 275 // Check compiledIC holders associated with this nmethod
>>>>> 276 CompiledIC *ic = CompiledIC_at(&iter); <---------------------------
>> ----
>>>> -----
>>>>>
>>>>> and
>>>>>
>>>>> 441void AOTCompiledMethod::clear_inline_caches() {
>>>>> 442 assert(SafepointSynchronize::is_at_safepoint(), "cleaning of IC's
>> only
>>>> allowed at safepoint");
>>>>> 443 if (is_zombie()) {
>>>>> 444 return;
>>>>> 445 }
>>>>> 446
>>>>> 447 RelocIterator iter(this);
>>>>> 448 while (iter.next()) {
>>>>> 449 iter.reloc()->clear_inline_cache();
>>>>> 450 if (iter.type() == relocInfo::opt_virtual_call_type) {
>>>>> 451 CompiledIC* cic = CompiledIC_at(&iter); <---------------------------
>> ----
>>>> -----
>>>>> 452 assert(cic->is_clean(), "!");
>>>>> 453 nativePltCall_at(iter.addr())->set_stub_to_clean();
>>>>> 454 }
>>>>> 455 }
>>>>> 456}
>>>>>
>>>>> src/hotspot/share/code/compiledMethod.cpp
>>>>>
>>>>> 326void CompiledMethod::clear_ic_stubs() {
>>>>> 327 assert_locked_or_safepoint(CompiledIC_lock);
>>>>> 328 RelocIterator iter(this);
>>>>> 329 while(iter.next()) {
>>>>> 330 if (iter.type() == relocInfo::virtual_call_type) {
>>>>> 331 CompiledIC* ic = CompiledIC_at(&iter); <---------------------------
>> ----
>>>> -----
>>>>> 332 ic->clear_ic_stub();
>>>>> 333 }
>>>>> 334 }
>>>>> 335}
>>>>>
>>>>>
>>>>> 547bool CompiledMethod::cleanup_inline_caches_impl(bool parallel,
>> bool
>>>> unloading_occurred, bool clean_all) {
>>>>> 548 assert_locked_or_safepoint(CompiledIC_lock);
>>>>> 549 bool postponed = false;
>>>>> 550
>>>>> 551 // Find all calls in an nmethod and clear the ones that point to non-
>>>> entrant,
>>>>> 552 // zombie and unloaded nmethods.
>>>>> 553 RelocIterator iter(this, oops_reloc_begin());
>>>>> 554 while(iter.next()) {
>>>>> 555
>>>>> 556 switch (iter.type()) {
>>>>> 557
>>>>> 558 case relocInfo::virtual_call_type:
>>>>> 559 if (unloading_occurred) {
>>>>> 560 // If class unloading occurred we first clear ICs where the cached
>>>> metadata
>>>>> 561 // is referring to an unloaded klass or method.
>>>>> 562 clean_ic_if_metadata_is_dead(CompiledIC_at(&iter)); <------
>> ---
>>>> ---------------------------
More information about the hotspot-dev
mailing list