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, [email protected] 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



Reply via email to