Mercurial > hg > truffle
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()); |