697 // InstanceKlass and TypeArrayKlass will in turn call remove_unshareable_info
698 // on their array classes.
699 assert(k->is_instance_klass() || k->is_typeArray_klass(), "must be");
700 k->remove_unshareable_info();
701 }
702 }
703 }
704
705 static void remove_java_mirror_in_classes() {
706 for (int i = 0; i < _global_klass_objects->length(); i++) {
707 Klass* k = _global_klass_objects->at(i);
708 if (!k->is_objArray_klass()) {
709 // InstanceKlass and TypeArrayKlass will in turn call remove_unshareable_info
710 // on their array classes.
711 assert(k->is_instance_klass() || k->is_typeArray_klass(), "must be");
712 k->remove_java_mirror();
713 }
714 }
715 }
716
717 static void clear_basic_type_mirrors() {
718 assert(!HeapShared::is_heap_object_archiving_allowed(), "Sanity");
719 Universe::set_int_mirror(NULL);
720 Universe::set_float_mirror(NULL);
721 Universe::set_double_mirror(NULL);
722 Universe::set_byte_mirror(NULL);
723 Universe::set_bool_mirror(NULL);
724 Universe::set_char_mirror(NULL);
725 Universe::set_long_mirror(NULL);
726 Universe::set_short_mirror(NULL);
727 Universe::set_void_mirror(NULL);
728 }
729
730 static void rewrite_nofast_bytecode(const methodHandle& method) {
731 BytecodeStream bcs(method);
732 while (!bcs.is_last_bytecode()) {
733 Bytecodes::Code opcode = bcs.next();
734 switch (opcode) {
735 case Bytecodes::_getfield: *bcs.bcp() = Bytecodes::_nofast_getfield; break;
736 case Bytecodes::_putfield: *bcs.bcp() = Bytecodes::_nofast_putfield; break;
737 case Bytecodes::_aload_0: *bcs.bcp() = Bytecodes::_nofast_aload_0; break;
738 case Bytecodes::_iload: {
739 if (!bcs.is_wide()) {
740 *bcs.bcp() = Bytecodes::_nofast_iload;
741 }
742 break;
743 }
744 default: break;
745 }
746 }
747 }
748
749 // Walk all methods in the class list to ensure that they won't be modified at
1523 assert(klass->is_klass(), "must be");
1524 return klass;
1525 }
1526 };
1527
1528 DumpAllocStats* ArchiveCompactor::_alloc_stats;
1529 ArchiveCompactor::RelocationTable* ArchiveCompactor::_new_loc_table;
1530
1531 void VM_PopulateDumpSharedSpace::dump_symbols() {
1532 log_info(cds)("Dumping symbol table ...");
1533
1534 NOT_PRODUCT(SymbolTable::verify());
1535 SymbolTable::write_to_archive();
1536 }
1537
1538 char* VM_PopulateDumpSharedSpace::dump_read_only_tables() {
1539 ArchiveCompactor::OtherROAllocMark mark;
1540
1541 log_info(cds)("Removing java_mirror ... ");
1542 if (!HeapShared::is_heap_object_archiving_allowed()) {
1543 clear_basic_type_mirrors();
1544 }
1545 remove_java_mirror_in_classes();
1546 log_info(cds)("done. ");
1547
1548 SystemDictionaryShared::write_to_archive();
1549
1550 // Write the other data to the output array.
1551 char* start = _ro_region.top();
1552 WriteClosure wc(&_ro_region);
1553 MetaspaceShared::serialize(&wc);
1554
1555 // Write the bitmaps for patching the archive heap regions
1556 _closed_archive_heap_oopmaps = NULL;
1557 _open_archive_heap_oopmaps = NULL;
1558 dump_archive_heap_oopmaps();
1559
1560 return start;
1561 }
1562
1563 void VM_PopulateDumpSharedSpace::print_class_stats() {
|
697 // InstanceKlass and TypeArrayKlass will in turn call remove_unshareable_info
698 // on their array classes.
699 assert(k->is_instance_klass() || k->is_typeArray_klass(), "must be");
700 k->remove_unshareable_info();
701 }
702 }
703 }
704
705 static void remove_java_mirror_in_classes() {
706 for (int i = 0; i < _global_klass_objects->length(); i++) {
707 Klass* k = _global_klass_objects->at(i);
708 if (!k->is_objArray_klass()) {
709 // InstanceKlass and TypeArrayKlass will in turn call remove_unshareable_info
710 // on their array classes.
711 assert(k->is_instance_klass() || k->is_typeArray_klass(), "must be");
712 k->remove_java_mirror();
713 }
714 }
715 }
716
717 static void rewrite_nofast_bytecode(const methodHandle& method) {
718 BytecodeStream bcs(method);
719 while (!bcs.is_last_bytecode()) {
720 Bytecodes::Code opcode = bcs.next();
721 switch (opcode) {
722 case Bytecodes::_getfield: *bcs.bcp() = Bytecodes::_nofast_getfield; break;
723 case Bytecodes::_putfield: *bcs.bcp() = Bytecodes::_nofast_putfield; break;
724 case Bytecodes::_aload_0: *bcs.bcp() = Bytecodes::_nofast_aload_0; break;
725 case Bytecodes::_iload: {
726 if (!bcs.is_wide()) {
727 *bcs.bcp() = Bytecodes::_nofast_iload;
728 }
729 break;
730 }
731 default: break;
732 }
733 }
734 }
735
736 // Walk all methods in the class list to ensure that they won't be modified at
1510 assert(klass->is_klass(), "must be");
1511 return klass;
1512 }
1513 };
1514
1515 DumpAllocStats* ArchiveCompactor::_alloc_stats;
1516 ArchiveCompactor::RelocationTable* ArchiveCompactor::_new_loc_table;
1517
1518 void VM_PopulateDumpSharedSpace::dump_symbols() {
1519 log_info(cds)("Dumping symbol table ...");
1520
1521 NOT_PRODUCT(SymbolTable::verify());
1522 SymbolTable::write_to_archive();
1523 }
1524
1525 char* VM_PopulateDumpSharedSpace::dump_read_only_tables() {
1526 ArchiveCompactor::OtherROAllocMark mark;
1527
1528 log_info(cds)("Removing java_mirror ... ");
1529 if (!HeapShared::is_heap_object_archiving_allowed()) {
1530 Universe::clear_basic_type_mirrors();
1531 }
1532 remove_java_mirror_in_classes();
1533 log_info(cds)("done. ");
1534
1535 SystemDictionaryShared::write_to_archive();
1536
1537 // Write the other data to the output array.
1538 char* start = _ro_region.top();
1539 WriteClosure wc(&_ro_region);
1540 MetaspaceShared::serialize(&wc);
1541
1542 // Write the bitmaps for patching the archive heap regions
1543 _closed_archive_heap_oopmaps = NULL;
1544 _open_archive_heap_oopmaps = NULL;
1545 dump_archive_heap_oopmaps();
1546
1547 return start;
1548 }
1549
1550 void VM_PopulateDumpSharedSpace::print_class_stats() {
|