comparison src/share/vm/runtime/vmStructs.cpp @ 2177:3582bf76420e

6990754: Use native memory and reference counting to implement SymbolTable Summary: move symbols from permgen into C heap and reference count them Reviewed-by: never, acorn, jmasa, stefank
author coleenp
date Thu, 27 Jan 2011 16:11:27 -0800
parents d4fca0a6abde
children b92c45f2bc75 638119ce7cfd
comparison
equal deleted inserted replaced
2176:27e4ea99855d 2177:3582bf76420e
81 #include "oops/methodOop.hpp" 81 #include "oops/methodOop.hpp"
82 #include "oops/objArrayKlass.hpp" 82 #include "oops/objArrayKlass.hpp"
83 #include "oops/objArrayKlassKlass.hpp" 83 #include "oops/objArrayKlassKlass.hpp"
84 #include "oops/objArrayOop.hpp" 84 #include "oops/objArrayOop.hpp"
85 #include "oops/oop.inline.hpp" 85 #include "oops/oop.inline.hpp"
86 #include "oops/symbolKlass.hpp" 86 #include "oops/symbol.hpp"
87 #include "oops/symbolOop.hpp"
88 #include "oops/typeArrayKlass.hpp" 87 #include "oops/typeArrayKlass.hpp"
89 #include "oops/typeArrayKlassKlass.hpp" 88 #include "oops/typeArrayKlassKlass.hpp"
90 #include "oops/typeArrayOop.hpp" 89 #include "oops/typeArrayOop.hpp"
91 #include "prims/jvmtiAgentThread.hpp" 90 #include "prims/jvmtiAgentThread.hpp"
92 #include "runtime/arguments.hpp" 91 #include "runtime/arguments.hpp"
244 nonstatic_field(instanceKlass, _fields, typeArrayOop) \ 243 nonstatic_field(instanceKlass, _fields, typeArrayOop) \
245 nonstatic_field(instanceKlass, _constants, constantPoolOop) \ 244 nonstatic_field(instanceKlass, _constants, constantPoolOop) \
246 nonstatic_field(instanceKlass, _class_loader, oop) \ 245 nonstatic_field(instanceKlass, _class_loader, oop) \
247 nonstatic_field(instanceKlass, _protection_domain, oop) \ 246 nonstatic_field(instanceKlass, _protection_domain, oop) \
248 nonstatic_field(instanceKlass, _signers, objArrayOop) \ 247 nonstatic_field(instanceKlass, _signers, objArrayOop) \
249 nonstatic_field(instanceKlass, _source_file_name, symbolOop) \ 248 nonstatic_field(instanceKlass, _source_file_name, Symbol*) \
250 nonstatic_field(instanceKlass, _source_debug_extension, symbolOop) \ 249 nonstatic_field(instanceKlass, _source_debug_extension, Symbol*) \
251 nonstatic_field(instanceKlass, _inner_classes, typeArrayOop) \ 250 nonstatic_field(instanceKlass, _inner_classes, typeArrayOop) \
252 nonstatic_field(instanceKlass, _nonstatic_field_size, int) \ 251 nonstatic_field(instanceKlass, _nonstatic_field_size, int) \
253 nonstatic_field(instanceKlass, _static_field_size, int) \ 252 nonstatic_field(instanceKlass, _static_field_size, int) \
254 nonstatic_field(instanceKlass, _static_oop_field_size, int) \ 253 nonstatic_field(instanceKlass, _static_oop_field_size, int) \
255 nonstatic_field(instanceKlass, _nonstatic_oop_map_size, int) \ 254 nonstatic_field(instanceKlass, _nonstatic_oop_map_size, int) \
263 nonstatic_field(instanceKlass, _reference_type, ReferenceType) \ 262 nonstatic_field(instanceKlass, _reference_type, ReferenceType) \
264 volatile_nonstatic_field(instanceKlass, _oop_map_cache, OopMapCache*) \ 263 volatile_nonstatic_field(instanceKlass, _oop_map_cache, OopMapCache*) \
265 nonstatic_field(instanceKlass, _jni_ids, JNIid*) \ 264 nonstatic_field(instanceKlass, _jni_ids, JNIid*) \
266 nonstatic_field(instanceKlass, _osr_nmethods_head, nmethod*) \ 265 nonstatic_field(instanceKlass, _osr_nmethods_head, nmethod*) \
267 nonstatic_field(instanceKlass, _breakpoints, BreakpointInfo*) \ 266 nonstatic_field(instanceKlass, _breakpoints, BreakpointInfo*) \
268 nonstatic_field(instanceKlass, _generic_signature, symbolOop) \ 267 nonstatic_field(instanceKlass, _generic_signature, Symbol*) \
269 nonstatic_field(instanceKlass, _methods_jmethod_ids, jmethodID*) \ 268 nonstatic_field(instanceKlass, _methods_jmethod_ids, jmethodID*) \
270 nonstatic_field(instanceKlass, _methods_cached_itable_indices, int*) \ 269 nonstatic_field(instanceKlass, _methods_cached_itable_indices, int*) \
271 volatile_nonstatic_field(instanceKlass, _idnum_allocated_count, u2) \ 270 volatile_nonstatic_field(instanceKlass, _idnum_allocated_count, u2) \
272 nonstatic_field(instanceKlass, _class_annotations, typeArrayOop) \ 271 nonstatic_field(instanceKlass, _class_annotations, typeArrayOop) \
273 nonstatic_field(instanceKlass, _fields_annotations, objArrayOop) \ 272 nonstatic_field(instanceKlass, _fields_annotations, objArrayOop) \
280 nonstatic_field(Klass, _primary_supers[0], klassOop) \ 279 nonstatic_field(Klass, _primary_supers[0], klassOop) \
281 nonstatic_field(Klass, _java_mirror, oop) \ 280 nonstatic_field(Klass, _java_mirror, oop) \
282 nonstatic_field(Klass, _modifier_flags, jint) \ 281 nonstatic_field(Klass, _modifier_flags, jint) \
283 nonstatic_field(Klass, _super, klassOop) \ 282 nonstatic_field(Klass, _super, klassOop) \
284 nonstatic_field(Klass, _layout_helper, jint) \ 283 nonstatic_field(Klass, _layout_helper, jint) \
285 nonstatic_field(Klass, _name, symbolOop) \ 284 nonstatic_field(Klass, _name, Symbol*) \
286 nonstatic_field(Klass, _access_flags, AccessFlags) \ 285 nonstatic_field(Klass, _access_flags, AccessFlags) \
287 nonstatic_field(Klass, _subklass, klassOop) \ 286 nonstatic_field(Klass, _subklass, klassOop) \
288 nonstatic_field(Klass, _next_sibling, klassOop) \ 287 nonstatic_field(Klass, _next_sibling, klassOop) \
289 nonproduct_nonstatic_field(Klass, _verify_count, int) \ 288 nonproduct_nonstatic_field(Klass, _verify_count, int) \
290 nonstatic_field(Klass, _alloc_count, juint) \ 289 nonstatic_field(Klass, _alloc_count, juint) \
324 nonstatic_field(constMethodOopDesc, _signature_index, u2) \ 323 nonstatic_field(constMethodOopDesc, _signature_index, u2) \
325 nonstatic_field(constMethodOopDesc, _method_idnum, u2) \ 324 nonstatic_field(constMethodOopDesc, _method_idnum, u2) \
326 nonstatic_field(constMethodOopDesc, _generic_signature_index, u2) \ 325 nonstatic_field(constMethodOopDesc, _generic_signature_index, u2) \
327 nonstatic_field(objArrayKlass, _element_klass, klassOop) \ 326 nonstatic_field(objArrayKlass, _element_klass, klassOop) \
328 nonstatic_field(objArrayKlass, _bottom_klass, klassOop) \ 327 nonstatic_field(objArrayKlass, _bottom_klass, klassOop) \
329 nonstatic_field(symbolKlass, _alloc_size, juint) \ 328 volatile_nonstatic_field(Symbol, _refcount, int) \
330 nonstatic_field(symbolOopDesc, _length, unsigned short) \ 329 nonstatic_field(Symbol, _identity_hash, int) \
331 unchecked_nonstatic_field(symbolOopDesc, _body, sizeof(jbyte)) /* NOTE: no type */ \ 330 nonstatic_field(Symbol, _length, unsigned short) \
331 unchecked_nonstatic_field(Symbol, _body, sizeof(jbyte)) /* NOTE: no type */ \
332 nonstatic_field(typeArrayKlass, _max_length, int) \ 332 nonstatic_field(typeArrayKlass, _max_length, int) \
333 \ 333 \
334 /***********************/ \ 334 /***********************/ \
335 /* Constant Pool Cache */ \ 335 /* Constant Pool Cache */ \
336 /***********************/ \ 336 /***********************/ \
373 static_field(Universe, _intArrayKlassObj, klassOop) \ 373 static_field(Universe, _intArrayKlassObj, klassOop) \
374 static_field(Universe, _shortArrayKlassObj, klassOop) \ 374 static_field(Universe, _shortArrayKlassObj, klassOop) \
375 static_field(Universe, _longArrayKlassObj, klassOop) \ 375 static_field(Universe, _longArrayKlassObj, klassOop) \
376 static_field(Universe, _singleArrayKlassObj, klassOop) \ 376 static_field(Universe, _singleArrayKlassObj, klassOop) \
377 static_field(Universe, _doubleArrayKlassObj, klassOop) \ 377 static_field(Universe, _doubleArrayKlassObj, klassOop) \
378 static_field(Universe, _symbolKlassObj, klassOop) \
379 static_field(Universe, _methodKlassObj, klassOop) \ 378 static_field(Universe, _methodKlassObj, klassOop) \
380 static_field(Universe, _constMethodKlassObj, klassOop) \ 379 static_field(Universe, _constMethodKlassObj, klassOop) \
381 static_field(Universe, _methodDataKlassObj, klassOop) \ 380 static_field(Universe, _methodDataKlassObj, klassOop) \
382 static_field(Universe, _klassKlassObj, klassOop) \ 381 static_field(Universe, _klassKlassObj, klassOop) \
383 static_field(Universe, _arrayKlassKlassObj, klassOop) \ 382 static_field(Universe, _arrayKlassKlassObj, klassOop) \
646 /* HashtableEntry */ \ 645 /* HashtableEntry */ \
647 /******************/ \ 646 /******************/ \
648 \ 647 \
649 nonstatic_field(BasicHashtableEntry, _next, BasicHashtableEntry*) \ 648 nonstatic_field(BasicHashtableEntry, _next, BasicHashtableEntry*) \
650 nonstatic_field(BasicHashtableEntry, _hash, unsigned int) \ 649 nonstatic_field(BasicHashtableEntry, _hash, unsigned int) \
651 nonstatic_field(HashtableEntry, _literal, oop) \ 650 nonstatic_field(HashtableEntry<intptr_t>, _literal, intptr_t) \
652 \ 651 \
653 /*************/ \ 652 /*************/ \
654 /* Hashtable */ \ 653 /* Hashtable */ \
655 /*************/ \ 654 /*************/ \
656 \ 655 \
681 \ 680 \
682 /*************************/ \ 681 /*************************/ \
683 /* LoaderConstraintEntry */ \ 682 /* LoaderConstraintEntry */ \
684 /*************************/ \ 683 /*************************/ \
685 \ 684 \
686 nonstatic_field(LoaderConstraintEntry, _name, symbolOop) \ 685 nonstatic_field(LoaderConstraintEntry, _name, Symbol*) \
687 nonstatic_field(LoaderConstraintEntry, _num_loaders, int) \ 686 nonstatic_field(LoaderConstraintEntry, _num_loaders, int) \
688 nonstatic_field(LoaderConstraintEntry, _max_loaders, int) \ 687 nonstatic_field(LoaderConstraintEntry, _max_loaders, int) \
689 nonstatic_field(LoaderConstraintEntry, _loaders, oop*) \ 688 nonstatic_field(LoaderConstraintEntry, _loaders, oop*) \
690 \ 689 \
691 /********************************/ \ 690 /********************************/ \
1086 declare_type(methodOopDesc, oopDesc) \ 1085 declare_type(methodOopDesc, oopDesc) \
1087 declare_type(objArrayKlass, arrayKlass) \ 1086 declare_type(objArrayKlass, arrayKlass) \
1088 declare_type(objArrayKlassKlass, arrayKlassKlass) \ 1087 declare_type(objArrayKlassKlass, arrayKlassKlass) \
1089 declare_type(objArrayOopDesc, arrayOopDesc) \ 1088 declare_type(objArrayOopDesc, arrayOopDesc) \
1090 declare_type(constMethodOopDesc, oopDesc) \ 1089 declare_type(constMethodOopDesc, oopDesc) \
1091 declare_type(symbolKlass, Klass) \
1092 declare_type(symbolOopDesc, oopDesc) \
1093 declare_type(typeArrayKlass, arrayKlass) \ 1090 declare_type(typeArrayKlass, arrayKlass) \
1094 declare_type(typeArrayKlassKlass, arrayKlassKlass) \ 1091 declare_type(typeArrayKlassKlass, arrayKlassKlass) \
1095 declare_type(typeArrayOopDesc, arrayOopDesc) \ 1092 declare_type(typeArrayOopDesc, arrayOopDesc) \
1093 declare_toplevel_type(Symbol) \
1094 declare_toplevel_type(Symbol*) \
1096 \ 1095 \
1097 /********/ \ 1096 /********/ \
1098 /* Oops */ \ 1097 /* Oops */ \
1099 /********/ \ 1098 /********/ \
1100 \ 1099 \
1107 declare_oop_type(objArrayOop) \ 1106 declare_oop_type(objArrayOop) \
1108 declare_oop_type(oop) \ 1107 declare_oop_type(oop) \
1109 declare_oop_type(narrowOop) \ 1108 declare_oop_type(narrowOop) \
1110 declare_oop_type(wideKlassOop) \ 1109 declare_oop_type(wideKlassOop) \
1111 declare_oop_type(constMethodOop) \ 1110 declare_oop_type(constMethodOop) \
1112 declare_oop_type(symbolOop) \
1113 declare_oop_type(typeArrayOop) \ 1111 declare_oop_type(typeArrayOop) \
1114 \ 1112 \
1115 /*************************************/ \ 1113 /*************************************/ \
1116 /* MethodOop-related data structures */ \ 1114 /* MethodOop-related data structures */ \
1117 /*************************************/ \ 1115 /*************************************/ \
1205 /*********************************/ \ 1203 /*********************************/ \
1206 /* SymbolTable, SystemDictionary */ \ 1204 /* SymbolTable, SystemDictionary */ \
1207 /*********************************/ \ 1205 /*********************************/ \
1208 \ 1206 \
1209 declare_toplevel_type(BasicHashtable) \ 1207 declare_toplevel_type(BasicHashtable) \
1210 declare_type(Hashtable, BasicHashtable) \ 1208 declare_type(Hashtable<intptr_t>, BasicHashtable) \
1211 declare_type(SymbolTable, Hashtable) \ 1209 declare_type(SymbolTable, Hashtable<Symbol*>) \
1212 declare_type(StringTable, Hashtable) \ 1210 declare_type(StringTable, Hashtable<oop>) \
1213 declare_type(LoaderConstraintTable, Hashtable) \ 1211 declare_type(LoaderConstraintTable, Hashtable<klassOop>) \
1214 declare_type(TwoOopHashtable, Hashtable) \ 1212 declare_type(TwoOopHashtable<klassOop>, Hashtable<klassOop>) \
1215 declare_type(Dictionary, TwoOopHashtable) \ 1213 declare_type(Dictionary, TwoOopHashtable<klassOop>) \
1216 declare_type(PlaceholderTable, TwoOopHashtable) \ 1214 declare_type(PlaceholderTable, TwoOopHashtable<Symbol*>) \
1217 declare_toplevel_type(Hashtable*) \
1218 declare_toplevel_type(SymbolTable*) \
1219 declare_toplevel_type(StringTable*) \
1220 declare_toplevel_type(LoaderConstraintTable*) \
1221 declare_toplevel_type(TwoOopHashtable*) \
1222 declare_toplevel_type(Dictionary*) \
1223 declare_toplevel_type(PlaceholderTable*) \
1224 declare_toplevel_type(BasicHashtableEntry) \ 1215 declare_toplevel_type(BasicHashtableEntry) \
1225 declare_toplevel_type(BasicHashtableEntry*) \ 1216 declare_type(HashtableEntry<intptr_t>, BasicHashtableEntry) \
1226 declare_type(HashtableEntry, BasicHashtableEntry) \ 1217 declare_type(DictionaryEntry, HashtableEntry<klassOop>) \
1227 declare_type(DictionaryEntry, HashtableEntry) \ 1218 declare_type(PlaceholderEntry, HashtableEntry<Symbol*>) \
1228 declare_type(PlaceholderEntry, HashtableEntry) \ 1219 declare_type(LoaderConstraintEntry, HashtableEntry<klassOop>) \
1229 declare_type(LoaderConstraintEntry, HashtableEntry) \
1230 declare_toplevel_type(HashtableEntry*) \
1231 declare_toplevel_type(DictionaryEntry*) \
1232 declare_toplevel_type(HashtableBucket) \ 1220 declare_toplevel_type(HashtableBucket) \
1233 declare_toplevel_type(HashtableBucket*) \
1234 declare_toplevel_type(SystemDictionary) \ 1221 declare_toplevel_type(SystemDictionary) \
1235 declare_toplevel_type(ProtectionDomainEntry) \ 1222 declare_toplevel_type(ProtectionDomainEntry) \
1236 declare_toplevel_type(ProtectionDomainEntry*) \
1237 \ 1223 \
1238 /***********************************************************/ \ 1224 /***********************************************************/ \
1239 /* Thread hierarchy (needed for run-time type information) */ \ 1225 /* Thread hierarchy (needed for run-time type information) */ \
1240 /***********************************************************/ \ 1226 /***********************************************************/ \
1241 \ 1227 \
1665 declare_constant(instanceKlass::being_initialized) \ 1651 declare_constant(instanceKlass::being_initialized) \
1666 declare_constant(instanceKlass::fully_initialized) \ 1652 declare_constant(instanceKlass::fully_initialized) \
1667 declare_constant(instanceKlass::initialization_error) \ 1653 declare_constant(instanceKlass::initialization_error) \
1668 \ 1654 \
1669 /*********************************/ \ 1655 /*********************************/ \
1670 /* symbolOop - symbol max length */ \ 1656 /* Symbol* - symbol max length */ \
1671 /*********************************/ \ 1657 /*********************************/ \
1672 \ 1658 \
1673 declare_constant(symbolOopDesc::max_symbol_length) \ 1659 declare_constant(Symbol::max_symbol_length) \
1674 \ 1660 \
1675 /*************************************************/ \ 1661 /*************************************************/ \
1676 /* constantPoolOop layout enum for InvokeDynamic */ \ 1662 /* constantPoolOop layout enum for InvokeDynamic */ \
1677 /*************************************************/ \ 1663 /*************************************************/ \
1678 \ 1664 \
2429 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMLongConstantEntryValueOffset, VMLongConstantEntry, value); 2415 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMLongConstantEntryValueOffset, VMLongConstantEntry, value);
2430 ASSIGN_STRIDE_TO_64BIT_VAR(gHotSpotVMLongConstantEntryArrayStride, gHotSpotVMLongConstants); 2416 ASSIGN_STRIDE_TO_64BIT_VAR(gHotSpotVMLongConstantEntryArrayStride, gHotSpotVMLongConstants);
2431 } 2417 }
2432 2418
2433 #ifdef ASSERT 2419 #ifdef ASSERT
2420 static int recursiveFindType(VMTypeEntry* origtypes, const char* typeName, bool isRecurse) {
2421 {
2422 VMTypeEntry* types = origtypes;
2423 while (types->typeName != NULL) {
2424 if (!strcmp(typeName, types->typeName)) {
2425 return 1;
2426 }
2427 ++types;
2428 }
2429 }
2430 size_t len = strlen(typeName);
2431 if (typeName[len-1] == '*') {
2432 char * s = new char[len];
2433 strncpy(s, typeName, len - 1);
2434 s[len-1] = '\0';
2435 // tty->print_cr("checking \"%s\" for \"%s\"", s, typeName);
2436 if (recursiveFindType(origtypes, s, true) == 1) {
2437 delete s;
2438 return 1;
2439 }
2440 delete s;
2441 }
2442 if (strstr(typeName, "GrowableArray<") == typeName) {
2443 const char * start = typeName + strlen("GrowableArray<");
2444 const char * end = strrchr(typeName, '>');
2445 int len = end - start + 1;
2446 char * s = new char[len];
2447 strncpy(s, start, len - 1);
2448 s[len-1] = '\0';
2449 // tty->print_cr("checking \"%s\" for \"%s\"", s, typeName);
2450 if (recursiveFindType(origtypes, s, true) == 1) {
2451 delete s;
2452 return 1;
2453 }
2454 delete s;
2455 }
2456 if (strstr(typeName, "const ") == typeName) {
2457 const char * s = typeName + strlen("const ");
2458 // tty->print_cr("checking \"%s\" for \"%s\"", s, typeName);
2459 if (recursiveFindType(origtypes, s, true) == 1) {
2460 return 1;
2461 }
2462 }
2463 if (strstr(typeName, " const") == typeName + len - 6) {
2464 char * s = strdup(typeName);
2465 s[len - 6] = '\0';
2466 // tty->print_cr("checking \"%s\" for \"%s\"", s, typeName);
2467 if (recursiveFindType(origtypes, s, true) == 1) {
2468 return 1;
2469 }
2470 }
2471 if (!isRecurse) {
2472 tty->print_cr("type \"%s\" not found", typeName);
2473 }
2474 return 2;
2475 }
2476
2477
2434 int 2478 int
2435 VMStructs::findType(const char* typeName) { 2479 VMStructs::findType(const char* typeName) {
2436 VMTypeEntry* types = gHotSpotVMTypes; 2480 VMTypeEntry* types = gHotSpotVMTypes;
2437 2481
2438 while (types->typeName != NULL) { 2482 return recursiveFindType(types, typeName, false);
2439 if (!strcmp(typeName, types->typeName)) {
2440 return 1;
2441 }
2442 ++types;
2443 }
2444 return 0;
2445 } 2483 }
2446 #endif 2484 #endif
2447 2485
2448 void vmStructs_init() { 2486 void vmStructs_init() {
2449 debug_only(VMStructs::init()); 2487 debug_only(VMStructs::init());