[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-serviceability-dev
Subject:    Re: RFR (M) 8046246: the constantPoolCacheOopDesc::adjust_method_entries()
From:       "serguei.spitsyn () oracle ! com" <serguei ! spitsyn () oracle ! com>
Date:       2015-02-20 19:19:03
Message-ID: 54E788A7.1000103 () oracle ! com
[Download RAW message or body]

Hi Coleen,

On 2/20/15 9:56 AM, Coleen Phillimore wrote:
> 
> Hi Serguei,  This looks good but I have some comments:

Thanks a lot for good suggestions and help in the internal review!

> 
> http://cr.openjdk.java.net/~sspitsyn/webrevs/2015/hotspot/8046246-JVMTI-redefscale.1/src/share/vm/oops/klassVtable.cpp.udiff.html \
>  
> 
> How can (old_method == new_method) in adjust_method_entries?   If 
> old_method->is_old() then you're not updating the vtables or the 
> itable?  It should assert with check_no_old_or_obsolete_entries() at 
> the end.


Nice catch, fixed in all 4 places.


> 
> http://cr.openjdk.java.net/~sspitsyn/webrevs/2015/hotspot/8046246-JVMTI-redefscale.1/src/share/vm/oops/cpCache.cpp.udiff.html \
>  
> 
> It looks like is_interesting_method_entry and 
> get_interesting_method_entry are the same code only one returns bool 
> and the other returns the Method*.   Can you call 
> is_interesting_method_entry and check for null return so there are not 
> two copies of this code?

Nice catch as well, fixed.


I'll post the updated webrev after some testing.


Thanks,
Serguei

> 
> thanks,
> Coleen
> 
> On 2/19/15, 12:45 AM, serguei.spitsyn@oracle.com wrote:
> > Please, review the fix for:
> > https://bugs.openjdk.java.net/browse/JDK-8046246
> > 
> > 
> > Open hotspot webrevs:
> > http://cr.openjdk.java.net/~sspitsyn/webrevs/2015/hotspot/8046246-JVMTI-redefscale.1/ \
> >  
> > 
> > Open jdk (new unit test) webrev:
> > http://cr.openjdk.java.net/~sspitsyn/webrevs/2015/jdk/8046246-JVMTI-manymethods.1/ \
> >  
> > 
> > 
> > Summary:
> > 
> > This performance/scalability issue in class redefinition was 
> > reported by HP and the Enterprise Manager team.
> > The following variants of the adjust_method_entries() functions do 
> > not scale:
> > ConstantPoolCache::adjust_method_entries()
> > klassVtable::adjust_method_entries()
> > klassItable::adjust_method_entries()
> > InstanceKlass::adjust_default_methods()
> > 
> > The ConstantPoolCache::adjust_method_entries() is the most important.
> > 
> > The approach is to use the holder->method_with_idnum() like this:
> > Method* new_method = 
> > holder->method_with_idnum(old_method->orig_method_idnum());
> > if (old_method != new_method) {
> > <replace old_method with new_method>
> > }
> > 
> > New algorithm has effectiveness O(M) instead of original O(M^2),
> > where M is count of methods in the class.
> > The new test (see webrev above) was used to mesure CPU time 
> > consumed by the
> > ConstantPoolCache::adjust_method_entries() in both original and 
> > new approach.
> > 
> > The performance numbers are:
> > 
> > --------------------------------------------------------------------------------------- \
> >  
> > Methods: ------ 1,000 --------------- 10,000 ----------------- 
> > 20,000
> > --------------------------------------------------------------------------------------- \
> >  
> > Orig:         600,000 nsec (1x)   60,500,000 nsec (~100x) 
> > 243,000,000 nsec (~400x)
> > New:           16,000 nsec (1x)      178,000 nsec (~10x) 355,000 
> > nsec  (~20x)
> > --------------------------------------------------------------------------------------- \
> >  
> > 
> > 
> > 
> > Testing:
> > In progress: VM SQE RedefineClasses tests, JTREG 
> > java/lang/instrument, com/sun/jdi tests
> > 
> > 
> > Thanks,
> > Serguei
> > 
> 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic