RFR (XXS): 8023191: OSR nmethods should be flushed to free space in CodeCache
Vladimir Kozlov
vladimir.kozlov at oracle.com
Thu Oct 10 11:47:42 PDT 2013
Albert,
I don't think you should do such refactoring now. Runtime and Embedded
will put you on "fire" for adding a field to Method class :)
Lets do your original changes only for now. And do more complete
solution suggested by John later for jdk9. File RFE.
Thanks,
Vladimir
On 10/10/13 8:34 AM, Albert Noll wrote:
> Vladimir, Chris, John, many thanks for your feedback.
>
> I'll run more tests to show that removing OSR methods in the sweeper is
> stable (or not).
> So far, I have not run into problems.
>
> @Chris, maybe you ran into 8024008 when you ran nashorn with a small
> code cache size.
>
> There is one thing I do not understand in the current implementation.
> What is the reason
> that OSR nmethods are maintained in InstanceKlass and not in Method?
> I do not see a reason but maybe I am missing something.
>
> Another thing I do not understand: When we remove an OSR method from the
> list (in InstanceKlass),
> we search for the max_comp level of all OSR nmethods of that class and
> then set this max_level as
> the max_level of the Method. Why would we set max_comp_level of Method X
> to max_comp_level of
> Method Y?
>
> I've an updated webrev, which moves the maintaining of the list of OSR
> methods from InstanceKlass to
> Method. This seems more logical to me. Moving the code to Method, also
> fixes the problem (if it is a
> problem) mentioned in the previous paragraph.
>
> Here is the webrev:
> http://cr.openjdk.java.net/~anoll/8023191/webrev.01/
> <http://cr.openjdk.java.net/%7Eanoll/8023191/webrev.01/>
>
> Tests are still running but so far everything looks good.
> Thanks in advance for your help.
>
> Best,
> Albert
>
> On 10.10.2013 00:18, Vladimir Kozlov wrote:
>> On 10/9/13 10:21 AM, Vladimir Kozlov wrote:
>>> Albert,
>>>
>>> Changes are fine but you need more testing.
>>>
>>> Run full CTW too and all jtreg tests from Hotspot and jdk (run jdk tests
>>> with -Xcomp and without it).
>>>
>>> Also the bug report has link to test (jittest). Can you build and run it
>>> too to see if it solves the problem with small codecache? It fills
>>> codecache with osr nmethods.
>>>
>>> It is very delicate matter. There was a reason we did not remove OSR
>>> nmethod until corresponding klass is unloaded (yes, deoptimization can
>>> make it non-entrant). Unfortunately I don't remember it. May be John
>>> know. Non of inline caches are pointing to OSR nmethods since it is
>>> called only from Interpreter. There is transition phase at the start of
>>> OSR nmethod when it calls runtime to convert interpreter frame to
>>> compiled frame. And method has separate field for osr nmethods.
>>
>> I think I dig out the answer.
>>
>> First, the last statement in previous mail is wrong. The method object
>> does not have reference to osr nmethods. Each java method can have
>> several alive OSR nmethods for different bcis. Instead method's holder
>> class has list of all OSR nmethods associated with all methods of this
>> class. Each time we do osr lookup we go through this list.
>> Since method does not have reference to OSR the original flushing
>> (speculative disconnection) could not be implemented for OSR nmethods.
>>
>> Second. Originally osr nmethod were not cleaned up from codecache.
>> Here is the comment and the code in
>> nmethod::make_not_entrant_or_zombie() from long time ago:
>>
>> // Code for an on-stack-replacement nmethod is removed when a class
>> gets unloaded.
>> // They never become zombie/non-entrant, so the nmethod sweeper will
>> never remove
>> // them. Instead the entry_bci is set to InvalidOSREntryBci, so the
>> osr nmethod
>> // will never be used anymore. That the nmethods only gets removed
>> when class unloading
>> // happens, make life much simpler, since the nmethods are not just
>> going to disappear
>> // out of the blue.
>> if (is_osr_only_method()) {
>> if (osr_entry_bci() != InvalidOSREntryBci) {
>> // only log this once
>> log_state_change(state);
>> }
>> invalidate_osr_method();
>> return;
>> }
>>
>> This code was changed by Tom for 5057818 4 years ago to allow cleanup
>> unused OSR nmethods from codecache:
>>
>> http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/032260830071
>>
>> Third, I think those changes are not complete.
>> nmethod::invalidate_osr_method() should check for _entry_bci ==
>> InvalidOSREntryBci to avoid lookup through osr list again after
>> nmethod change from non_entrant to zombie (invalidate_osr_method() is
>> called each time make_not_entrant_or_zombie() is called). May be other
>> places. Note, when we process osr nmethod::_code should not be touched
>> since it is pointing to normal compiled nmethod which could still be
>> alive.
>>
>> Thanks,
>> Vladimir
>>
>>>
>>> Thanks,
>>> Vladimir
>>>
>>> On 10/8/13 10:18 PM, Albert Noll wrote:
>>>> Hi,
>>>>
>>>> could I have a review for this small patch?
>>>>
>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8023191
>>>> webrev: http://cr.openjdk.java.net/~anoll/8023191/webrev.00/
>>>> <http://cr.openjdk.java.net/%7Eanoll/8023191/webrev.00/>
>>>>
>>>> Problem: OSR methods are not removed from code cache to free space.
>>>> Solution: Remove OSR methods from code cache. OSR methods c an be made
>>>> not-entrant and are then removed from the code cache
>>>> likenon-OSR
>>>> methods. Other parts in the code (e.g.,
>>>> deoptimization.cpp:1547) already make
>>>> OSR methods not-entrant.
>>>>
>>>> Testing: Passed JPRT; I'll also run specjvm and nashorn to see if there
>>>> is an impact on performance.
>>>>
>>>> Many thanks in advance,
>>>> Albert
>
More information about the hotspot-compiler-dev
mailing list