comparison src/share/vm/oops/klassVtable.cpp @ 8021:8d9fc28831cc

7182152: Instrumentation hot swap test incorrect monitor count Summary: Add/refine new tracing support using -XX:TraceRedefineClasses=16384. Reviewed-by: coleenp, acorn, sspitsyn
author dcubed
date Wed, 06 Feb 2013 14:31:37 -0800
parents 070d523b96a7
children cd3089a56438
comparison
equal deleted inserted replaced
7988:f3ea1af9207a 8021:8d9fc28831cc
1 /* 1 /*
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
608 608
609 void klassVtable::copy_vtable_to(vtableEntry* start) { 609 void klassVtable::copy_vtable_to(vtableEntry* start) {
610 Copy::disjoint_words((HeapWord*)table(), (HeapWord*)start, _length * vtableEntry::size()); 610 Copy::disjoint_words((HeapWord*)table(), (HeapWord*)start, _length * vtableEntry::size());
611 } 611 }
612 612
613 #if INCLUDE_JVMTI
613 void klassVtable::adjust_method_entries(Method** old_methods, Method** new_methods, 614 void klassVtable::adjust_method_entries(Method** old_methods, Method** new_methods,
614 int methods_length, bool * trace_name_printed) { 615 int methods_length, bool * trace_name_printed) {
615 // search the vtable for uses of either obsolete or EMCP methods 616 // search the vtable for uses of either obsolete or EMCP methods
616 for (int j = 0; j < methods_length; j++) { 617 for (int j = 0; j < methods_length; j++) {
617 Method* old_method = old_methods[j]; 618 Method* old_method = old_methods[j];
636 // RC_TRACE macro has an embedded ResourceMark 637 // RC_TRACE macro has an embedded ResourceMark
637 RC_TRACE(0x00100000, ("vtable method update: %s(%s)", 638 RC_TRACE(0x00100000, ("vtable method update: %s(%s)",
638 new_method->name()->as_C_string(), 639 new_method->name()->as_C_string(),
639 new_method->signature()->as_C_string())); 640 new_method->signature()->as_C_string()));
640 } 641 }
642 // cannot 'break' here; see for-loop comment above.
641 } 643 }
642 } 644 }
643 } 645 }
644 } 646 }
647
648 // a vtable should never contain old or obsolete methods
649 bool klassVtable::check_no_old_or_obsolete_entries() {
650 for (int i = 0; i < length(); i++) {
651 Method* m = unchecked_method_at(i);
652 if (m != NULL &&
653 (NOT_PRODUCT(!m->is_valid() ||) m->is_old() || m->is_obsolete())) {
654 return false;
655 }
656 }
657 return true;
658 }
659
660 void klassVtable::dump_vtable() {
661 tty->print_cr("vtable dump --");
662 for (int i = 0; i < length(); i++) {
663 Method* m = unchecked_method_at(i);
664 if (m != NULL) {
665 tty->print(" (%5d) ", i);
666 m->access_flags().print_on(tty);
667 tty->print(" -- ");
668 m->print_name(tty);
669 tty->cr();
670 }
671 }
672 }
673 #endif // INCLUDE_JVMTI
645 674
646 // CDS/RedefineClasses support - clear vtables so they can be reinitialized 675 // CDS/RedefineClasses support - clear vtables so they can be reinitialized
647 void klassVtable::clear_vtable() { 676 void klassVtable::clear_vtable() {
648 for (int i = 0; i < _length; i++) table()[i].clear(); 677 for (int i = 0; i < _length; i++) table()[i].clear();
649 } 678 }
803 } 832 }
804 ime++; 833 ime++;
805 } 834 }
806 } 835 }
807 836
837 #if INCLUDE_JVMTI
808 void klassItable::adjust_method_entries(Method** old_methods, Method** new_methods, 838 void klassItable::adjust_method_entries(Method** old_methods, Method** new_methods,
809 int methods_length, bool * trace_name_printed) { 839 int methods_length, bool * trace_name_printed) {
810 // search the itable for uses of either obsolete or EMCP methods 840 // search the itable for uses of either obsolete or EMCP methods
811 for (int j = 0; j < methods_length; j++) { 841 for (int j = 0; j < methods_length; j++) {
812 Method* old_method = old_methods[j]; 842 Method* old_method = old_methods[j];
831 // RC_TRACE macro has an embedded ResourceMark 861 // RC_TRACE macro has an embedded ResourceMark
832 RC_TRACE(0x00200000, ("itable method update: %s(%s)", 862 RC_TRACE(0x00200000, ("itable method update: %s(%s)",
833 new_method->name()->as_C_string(), 863 new_method->name()->as_C_string(),
834 new_method->signature()->as_C_string())); 864 new_method->signature()->as_C_string()));
835 } 865 }
836 // Cannot break because there might be another entry for this method 866 // cannot 'break' here; see for-loop comment above.
837 } 867 }
838 ime++; 868 ime++;
839 } 869 }
840 } 870 }
841 } 871 }
872
873 // an itable should never contain old or obsolete methods
874 bool klassItable::check_no_old_or_obsolete_entries() {
875 itableMethodEntry* ime = method_entry(0);
876 for (int i = 0; i < _size_method_table; i++) {
877 Method* m = ime->method();
878 if (m != NULL &&
879 (NOT_PRODUCT(!m->is_valid() ||) m->is_old() || m->is_obsolete())) {
880 return false;
881 }
882 ime++;
883 }
884 return true;
885 }
886
887 void klassItable::dump_itable() {
888 itableMethodEntry* ime = method_entry(0);
889 tty->print_cr("itable dump --");
890 for (int i = 0; i < _size_method_table; i++) {
891 Method* m = ime->method();
892 if (m != NULL) {
893 tty->print(" (%5d) ", i);
894 m->access_flags().print_on(tty);
895 tty->print(" -- ");
896 m->print_name(tty);
897 tty->cr();
898 }
899 ime++;
900 }
901 }
902 #endif // INCLUDE_JVMTI
842 903
843 904
844 // Setup 905 // Setup
845 class InterfaceVisiterClosure : public StackObj { 906 class InterfaceVisiterClosure : public StackObj {
846 public: 907 public:
1124 tty->print_cr("%6d bytes filler overhead", VtableStats::filler); 1185 tty->print_cr("%6d bytes filler overhead", VtableStats::filler);
1125 tty->print_cr("%6d bytes for vtable entries (%d for arrays)", VtableStats::entries, VtableStats::array_entries); 1186 tty->print_cr("%6d bytes for vtable entries (%d for arrays)", VtableStats::entries, VtableStats::array_entries);
1126 tty->print_cr("%6d bytes total", total); 1187 tty->print_cr("%6d bytes total", total);
1127 } 1188 }
1128 1189
1129 bool klassVtable::check_no_old_entries() {
1130 // Check that there really is no entry
1131 for (int i = 0; i < length(); i++) {
1132 Method* m = unchecked_method_at(i);
1133 if (m != NULL) {
1134 if (!m->is_valid() || m->is_old()) {
1135 return false;
1136 }
1137 }
1138 }
1139 return true;
1140 }
1141
1142 void klassVtable::dump_vtable() {
1143 tty->print_cr("vtable dump --");
1144 for (int i = 0; i < length(); i++) {
1145 Method* m = unchecked_method_at(i);
1146 if (m != NULL) {
1147 tty->print(" (%5d) ", i);
1148 m->access_flags().print_on(tty);
1149 tty->print(" -- ");
1150 m->print_name(tty);
1151 tty->cr();
1152 }
1153 }
1154 }
1155
1156 bool klassItable::check_no_old_entries() {
1157 itableMethodEntry* ime = method_entry(0);
1158 for(int i = 0; i < _size_method_table; i++) {
1159 Method* m = ime->method();
1160 if (m != NULL && (!m->is_valid() || m->is_old())) return false;
1161 ime++;
1162 }
1163 return true;
1164 }
1165
1166 int klassItable::_total_classes; // Total no. of classes with itables 1190 int klassItable::_total_classes; // Total no. of classes with itables
1167 long klassItable::_total_size; // Total no. of bytes used for itables 1191 long klassItable::_total_size; // Total no. of bytes used for itables
1168 1192
1169 void klassItable::print_statistics() { 1193 void klassItable::print_statistics() {
1170 tty->print_cr("itable statistics:"); 1194 tty->print_cr("itable statistics:");