Thu, 23 May 2013 23:04:33 -0700
8014288: perf regression in nashorn JDK-8008448.js test after 8008511 changes
Summary: The fix of perf regression is to use method_idnum() for direct indexing into NMT
Reviewed-by: twisti, kvn, coleenp, dholmes
Contributed-by: serguei.spitsyn@oracle.com
1.1 --- a/src/share/vm/oops/instanceKlass.cpp Thu May 23 17:39:32 2013 +0200 1.2 +++ b/src/share/vm/oops/instanceKlass.cpp Thu May 23 23:04:33 2013 -0700 1.3 @@ -2754,15 +2754,28 @@ 1.4 return NULL; 1.5 } 1.6 1.7 -void InstanceKlass::add_member_name(Handle mem_name) { 1.8 +void InstanceKlass::add_member_name(int index, Handle mem_name) { 1.9 jweak mem_name_wref = JNIHandles::make_weak_global(mem_name); 1.10 MutexLocker ml(MemberNameTable_lock); 1.11 + assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds"); 1.12 DEBUG_ONLY(No_Safepoint_Verifier nsv); 1.13 1.14 if (_member_names == NULL) { 1.15 - _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(); 1.16 + _member_names = new (ResourceObj::C_HEAP, mtClass) MemberNameTable(idnum_allocated_count()); 1.17 } 1.18 - _member_names->add_member_name(mem_name_wref); 1.19 + _member_names->add_member_name(index, mem_name_wref); 1.20 +} 1.21 + 1.22 +oop InstanceKlass::get_member_name(int index) { 1.23 + MutexLocker ml(MemberNameTable_lock); 1.24 + assert(0 <= index && index < idnum_allocated_count(), "index is out of bounds"); 1.25 + DEBUG_ONLY(No_Safepoint_Verifier nsv); 1.26 + 1.27 + if (_member_names == NULL) { 1.28 + return NULL; 1.29 + } 1.30 + oop mem_name =_member_names->get_member_name(index); 1.31 + return mem_name; 1.32 } 1.33 1.34 // -----------------------------------------------------------------------------------------------------
2.1 --- a/src/share/vm/oops/instanceKlass.hpp Thu May 23 17:39:32 2013 +0200 2.2 +++ b/src/share/vm/oops/instanceKlass.hpp Thu May 23 23:04:33 2013 -0700 2.3 @@ -1022,7 +1022,8 @@ 2.4 // JSR-292 support 2.5 MemberNameTable* member_names() { return _member_names; } 2.6 void set_member_names(MemberNameTable* member_names) { _member_names = member_names; } 2.7 - void add_member_name(Handle member_name); 2.8 + void add_member_name(int index, Handle member_name); 2.9 + oop get_member_name(int index); 2.10 2.11 public: 2.12 // JVMTI support
3.1 --- a/src/share/vm/prims/methodHandles.cpp Thu May 23 17:39:32 2013 +0200 3.2 +++ b/src/share/vm/prims/methodHandles.cpp Thu May 23 23:04:33 2013 -0700 3.3 @@ -1,5 +1,5 @@ 3.4 /* 3.5 - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. 3.6 + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. 3.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3.8 * 3.9 * This code is free software; you can redistribute it and/or modify it 3.10 @@ -232,7 +232,8 @@ 3.11 // This is done eagerly, since it is readily available without 3.12 // constructing any new objects. 3.13 // TO DO: maybe intern mname_oop 3.14 - m->method_holder()->add_member_name(mname); 3.15 + m->method_holder()->add_member_name(m->method_idnum(), mname); 3.16 + 3.17 return mname(); 3.18 } 3.19 3.20 @@ -301,7 +302,6 @@ 3.21 // Although the fieldDescriptor::_index would also identify the field, 3.22 // we do not use it, because it is harder to decode. 3.23 // TO DO: maybe intern mname_oop 3.24 - InstanceKlass::cast(field_holder())->add_member_name(mname); 3.25 return mname(); 3.26 } 3.27 3.28 @@ -943,7 +943,8 @@ 3.29 // MemberNameTable 3.30 // 3.31 3.32 -MemberNameTable::MemberNameTable() : GrowableArray<jweak>(10, true) { 3.33 +MemberNameTable::MemberNameTable(int methods_cnt) 3.34 + : GrowableArray<jweak>(methods_cnt, true) { 3.35 assert_locked_or_safepoint(MemberNameTable_lock); 3.36 } 3.37 3.38 @@ -957,29 +958,18 @@ 3.39 } 3.40 } 3.41 3.42 -// Return entry index if found, return -1 otherwise. 3.43 -int MemberNameTable::find_member_name(oop mem_name) { 3.44 +void MemberNameTable::add_member_name(int index, jweak mem_name_wref) { 3.45 assert_locked_or_safepoint(MemberNameTable_lock); 3.46 - int len = this->length(); 3.47 - 3.48 - for (int idx = 0; idx < len; idx++) { 3.49 - jweak ref = this->at(idx); 3.50 - oop entry = JNIHandles::resolve(ref); 3.51 - if (entry == mem_name) { 3.52 - return idx; 3.53 - } 3.54 - } 3.55 - return -1; 3.56 + this->at_put_grow(index, mem_name_wref); 3.57 } 3.58 3.59 -void MemberNameTable::add_member_name(jweak mem_name_wref) { 3.60 +// Return a member name oop or NULL. 3.61 +oop MemberNameTable::get_member_name(int index) { 3.62 assert_locked_or_safepoint(MemberNameTable_lock); 3.63 - oop mem_name = JNIHandles::resolve(mem_name_wref); 3.64 3.65 - // Each member name may appear just once: add only if not found 3.66 - if (find_member_name(mem_name) == -1) { 3.67 - this->append(mem_name_wref); 3.68 - } 3.69 + jweak ref = this->at(index); 3.70 + oop mem_name = JNIHandles::resolve(ref); 3.71 + return mem_name; 3.72 } 3.73 3.74 #if INCLUDE_JVMTI
4.1 --- a/src/share/vm/prims/methodHandles.hpp Thu May 23 17:39:32 2013 +0200 4.2 +++ b/src/share/vm/prims/methodHandles.hpp Thu May 23 23:04:33 2013 -0700 4.3 @@ -1,5 +1,5 @@ 4.4 /* 4.5 - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. 4.6 + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. 4.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4.8 * 4.9 * This code is free software; you can redistribute it and/or modify it 4.10 @@ -219,7 +219,6 @@ 4.11 } 4.12 }; 4.13 4.14 - 4.15 //------------------------------------------------------------------------------ 4.16 // MethodHandlesAdapterGenerator 4.17 // 4.18 @@ -233,13 +232,13 @@ 4.19 //------------------------------------------------------------------------------ 4.20 // MemberNameTable 4.21 // 4.22 + 4.23 class MemberNameTable : public GrowableArray<jweak> { 4.24 public: 4.25 - MemberNameTable(); 4.26 + MemberNameTable(int methods_cnt); 4.27 ~MemberNameTable(); 4.28 - void add_member_name(jweak mem_name_ref); 4.29 - private: 4.30 - int find_member_name(oop mem_name); 4.31 + void add_member_name(int index, jweak mem_name_ref); 4.32 + oop get_member_name(int index); 4.33 4.34 #if INCLUDE_JVMTI 4.35 public: