< prev index next >

src/hotspot/share/memory/metaspaceShared.cpp

Print this page

        

*** 661,670 **** --- 661,697 ---- } } } }; + // Global object for holding symbols that created during class loading. See SymbolTable::new_symbol + static GrowableArray<Symbol*>* _global_symbol_objects = NULL; + + static int compare_symbols_by_address(Symbol** a, Symbol** b) { + if (a[0] < b[0]) { + return -1; + } else if (a[0] == b[0]) { + ResourceMark rm; + log_warning(cds)("Duplicated symbol %s unexpected", (*a)->as_C_string()); + return 0; + } else { + return 1; + } + } + + void MetaspaceShared::add_symbol(Symbol* sym) { + MutexLocker ml(CDSAddSymbol_lock, Mutex::_no_safepoint_check_flag); + if (_global_symbol_objects == NULL) { + _global_symbol_objects = new (ResourceObj::C_HEAP, mtSymbol) GrowableArray<Symbol*>(2048, mtSymbol); + } + _global_symbol_objects->append(sym); + } + + GrowableArray<Symbol*>* MetaspaceShared::collected_symbols() { + return _global_symbol_objects; + } + static void remove_unshareable_in_classes() { for (int i = 0; i < _global_klass_objects->length(); i++) { Klass* k = _global_klass_objects->at(i); if (!k->is_objArray_klass()) { // InstanceKlass and TypeArrayKlass will in turn call remove_unshareable_info
*** 1236,1273 **** VMOp_Type type() const { return VMOp_PopulateDumpSharedSpace; } void doit(); // outline because gdb sucks bool allow_nested_vm_operations() const { return true; } }; // class VM_PopulateDumpSharedSpace - class SortedSymbolClosure: public SymbolClosure { - GrowableArray<Symbol*> _symbols; - virtual void do_symbol(Symbol** sym) { - assert((*sym)->is_permanent(), "archived symbols must be permanent"); - _symbols.append(*sym); - } - static int compare_symbols_by_address(Symbol** a, Symbol** b) { - if (a[0] < b[0]) { - return -1; - } else if (a[0] == b[0]) { - ResourceMark rm; - log_warning(cds)("Duplicated symbol %s unexpected", (*a)->as_C_string()); - return 0; - } else { - return 1; - } - } - - public: - SortedSymbolClosure() { - SymbolTable::symbols_do(this); - _symbols.sort(compare_symbols_by_address); - } - GrowableArray<Symbol*>* get_sorted_symbols() { - return &_symbols; - } - }; - // ArchiveCompactor -- // // This class is the central piece of shared archive compaction -- all metaspace data are // initially allocated outside of the shared regions. ArchiveCompactor copies the // metaspace data into their final location in the shared regions. --- 1263,1272 ----
*** 1275,1285 **** class ArchiveCompactor : AllStatic { static const int INITIAL_TABLE_SIZE = 8087; static const int MAX_TABLE_SIZE = 1000000; static DumpAllocStats* _alloc_stats; - static SortedSymbolClosure* _ssc; typedef KVHashtable<address, address, mtInternal> RelocationTable; static RelocationTable* _new_loc_table; public: --- 1274,1283 ----
*** 1419,1430 **** #endif public: static void copy_and_compact() { ResourceMark rm; - SortedSymbolClosure the_ssc; // StackObj - _ssc = &the_ssc; log_info(cds)("Scanning all metaspace objects ... "); { // allocate and shallow-copy RW objects, immediately following the MC region log_info(cds)("Allocating RW objects ... "); --- 1417,1426 ----
*** 1456,1482 **** iterate_roots(&ext_reloc); } { log_info(cds)("Fixing symbol identity hash ... "); os::init_random(0x12345678); ! GrowableArray<Symbol*>* symbols = _ssc->get_sorted_symbols(); ! for (int i=0; i<symbols->length(); i++) { ! symbols->at(i)->update_identity_hash(); } } #ifdef ASSERT { log_info(cds)("Verifying external roots ... "); ResourceMark rm; IsRefInArchiveChecker checker; iterate_roots(&checker); } #endif - - - // cleanup - _ssc = NULL; } // We must relocate the System::_well_known_klasses only after we have copied the // java objects in during dump_java_heap_objects(): during the object copy, we operate on // old objects which assert that their klass is the original klass. --- 1452,1475 ---- iterate_roots(&ext_reloc); } { log_info(cds)("Fixing symbol identity hash ... "); os::init_random(0x12345678); ! GrowableArray<Symbol*>* all_symbols = MetaspaceShared::collected_symbols(); ! all_symbols->sort(compare_symbols_by_address); ! for (int i = 0; i < all_symbols->length(); i++) { ! all_symbols->at(i)->update_identity_hash(); } } #ifdef ASSERT { log_info(cds)("Verifying external roots ... "); ResourceMark rm; IsRefInArchiveChecker checker; iterate_roots(&checker); } #endif } // We must relocate the System::_well_known_klasses only after we have copied the // java objects in during dump_java_heap_objects(): during the object copy, we operate on // old objects which assert that their klass is the original klass.
*** 1508,1519 **** // the SharedClassListFile (class loading is done in a single thread and the JIT // is disabled). Also, Symbols are allocated in monotonically increasing addresses // (see Symbol::operator new(size_t, int)). So if we iterate the Symbols by // ascending address order, we ensure that all Symbols are copied into deterministic // locations in the archive. ! GrowableArray<Symbol*>* symbols = _ssc->get_sorted_symbols(); ! for (int i=0; i<symbols->length(); i++) { it->push(symbols->adr_at(i)); } if (_global_klass_objects != NULL) { // Need to fix up the pointers for (int i = 0; i < _global_klass_objects->length(); i++) { --- 1501,1512 ---- // the SharedClassListFile (class loading is done in a single thread and the JIT // is disabled). Also, Symbols are allocated in monotonically increasing addresses // (see Symbol::operator new(size_t, int)). So if we iterate the Symbols by // ascending address order, we ensure that all Symbols are copied into deterministic // locations in the archive. ! GrowableArray<Symbol*>* symbols = _global_symbol_objects; ! for (int i = 0; i < symbols->length(); i++) { it->push(symbols->adr_at(i)); } if (_global_klass_objects != NULL) { // Need to fix up the pointers for (int i = 0; i < _global_klass_objects->length(); i++) {
*** 1539,1549 **** return klass; } }; DumpAllocStats* ArchiveCompactor::_alloc_stats; - SortedSymbolClosure* ArchiveCompactor::_ssc; ArchiveCompactor::RelocationTable* ArchiveCompactor::_new_loc_table; void VM_PopulateDumpSharedSpace::dump_symbols() { log_info(cds)("Dumping symbol table ..."); --- 1532,1541 ----
< prev index next >