142 } else {
143 // Get the hash value. Use a static seed because the hash needs to return the same
144 // value over multiple jvm invocations.
145 unsigned int hash = AltHashing::murmur3_32(8191, (const jbyte*)vm_version, version_len);
146
147 // Truncate the ident, saving room for the 8 hex character hash value.
148 strncpy(header_version, vm_version, JVM_IDENT_MAX-9);
149
150 // Append the hash code as eight hex digits.
151 sprintf(&header_version[JVM_IDENT_MAX-9], "%08x", hash);
152 header_version[JVM_IDENT_MAX-1] = 0; // Null terminate.
153 }
154 }
155
156 FileMapInfo::FileMapInfo() {
157 assert(_current_info == NULL, "must be singleton"); // not thread safe
158 _current_info = this;
159 memset((void*)this, 0, sizeof(FileMapInfo));
160 _file_offset = 0;
161 _file_open = false;
162 _header = new FileMapHeader();
163 _header->_version = _invalid_version;
164 _header->_has_platform_or_app_classes = true;
165 }
166
167 FileMapInfo::~FileMapInfo() {
168 assert(_current_info == this, "must be singleton"); // not thread safe
169 _current_info = NULL;
170 }
171
172 void FileMapInfo::populate_header(size_t alignment) {
173 _header->populate(this, alignment);
174 }
175
176 void FileMapInfo::FileMapHeader::populate(FileMapInfo* mapinfo, size_t alignment) {
177 _magic = 0xf00baba2;
178 _version = _current_version;
179 _alignment = alignment;
180 _obj_alignment = ObjectAlignmentInBytes;
181 _compact_strings = CompactStrings;
182 _narrow_oop_mode = Universe::narrow_oop_mode();
183 _narrow_oop_base = Universe::narrow_oop_base();
184 _narrow_oop_shift = Universe::narrow_oop_shift();
185 _max_heap_size = MaxHeapSize;
186 _narrow_klass_base = Universe::narrow_klass_base();
187 _narrow_klass_shift = Universe::narrow_klass_shift();
188 _shared_path_table_size = mapinfo->_shared_path_table_size;
189 _shared_path_table = mapinfo->_shared_path_table;
190 _shared_path_entry_size = mapinfo->_shared_path_entry_size;
191
192 // The following fields are for sanity checks for whether this archive
193 // will function correctly with this JVM and the bootclasspath it's
194 // invoked with.
195
196 // JVM version string ... changes on each build.
197 get_header_version(_jvm_ident);
198
480 }
481 } else if (i >= module_paths_start_index) {
482 if (shared_path(i)->validate(false /* not a class path entry */)) {
483 log_info(class, path)("ok");
484 }
485 } else if (!PrintSharedArchiveAndExit) {
486 _validating_shared_path_table = false;
487 _shared_path_table = NULL;
488 _shared_path_table_size = 0;
489 return false;
490 }
491 }
492
493 _validating_shared_path_table = false;
494 return true;
495 }
496
497 // Read the FileMapInfo information from the file.
498
499 bool FileMapInfo::init_from_file(int fd) {
500 size_t sz = _header->data_size();
501 char* addr = _header->data();
502 size_t n = os::read(fd, addr, (unsigned int)sz);
503 if (n != sz) {
504 fail_continue("Unable to read the file header.");
505 return false;
506 }
507 if (_header->_version != current_version()) {
508 fail_continue("The shared archive file has the wrong version.");
509 return false;
510 }
511 _file_offset = (long)n;
512
513 size_t info_size = _header->_paths_misc_info_size;
514 _paths_misc_info = NEW_C_HEAP_ARRAY_RETURN_NULL(char, info_size, mtClass);
515 if (_paths_misc_info == NULL) {
516 fail_continue("Unable to read the file header.");
517 return false;
518 }
519 n = os::read(fd, _paths_misc_info, (unsigned int)info_size);
520 if (n != info_size) {
521 fail_continue("Unable to read the shared path info header.");
522 FREE_C_HEAP_ARRAY(char, _paths_misc_info);
523 _paths_misc_info = NULL;
524 return false;
525 }
526
527 size_t len = lseek(fd, 0, SEEK_END);
528 struct FileMapInfo::FileMapHeader::space_info* si =
529 &_header->_space[MetaspaceShared::last_valid_region];
530 // The last space might be empty
531 if (si->_file_offset > len || len - si->_file_offset < si->_used) {
532 fail_continue("The shared archive file has been truncated.");
533 return false;
534 }
535
536 _file_offset += (long)n;
537 return true;
538 }
539
540
541 // Read the FileMapInfo information from the file.
542 bool FileMapInfo::open_for_read() {
543 _full_path = Arguments::GetSharedArchivePath();
544 int fd = open(_full_path, O_RDONLY | O_BINARY, 0);
545 if (fd < 0) {
546 if (errno == ENOENT) {
547 // Not locating the shared archive is ok.
548 fail_continue("Specified shared archive not found.");
549 } else {
578 remove(_full_path);
579 int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0444);
580 if (fd < 0) {
581 fail_stop("Unable to create shared archive file %s: (%s).", _full_path,
582 os::strerror(errno));
583 }
584 _fd = fd;
585 _file_offset = 0;
586 _file_open = true;
587 }
588
589
590 // Write the header to the file, seek to the next allocation boundary.
591
592 void FileMapInfo::write_header() {
593 int info_size = ClassLoader::get_shared_paths_misc_info_size();
594
595 _header->_paths_misc_info_size = info_size;
596
597 align_file_position();
598 size_t sz = _header->data_size();
599 char* addr = _header->data();
600 write_bytes(addr, (int)sz); // skip the C++ vtable
601 write_bytes(ClassLoader::get_shared_paths_misc_info(), info_size);
602 align_file_position();
603 }
604
605
606 // Dump region to file.
607
608 void FileMapInfo::write_region(int region, char* base, size_t size,
609 bool read_only, bool allow_exec) {
610 struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[region];
611
612 if (_file_open) {
613 guarantee(si->_file_offset == _file_offset, "file offset mismatch.");
614 log_info(cds)("Shared file region %d: " SIZE_FORMAT_HEX_W(08)
615 " bytes, addr " INTPTR_FORMAT " file offset " SIZE_FORMAT_HEX_W(08),
616 region, size, p2i(base), _file_offset);
617 } else {
618 si->_file_offset = _file_offset;
619 }
620 if (MetaspaceShared::is_heap_region(region)) {
621 assert((base - (char*)Universe::narrow_oop_base()) % HeapWordSize == 0, "Sanity");
622 if (base != NULL) {
623 si->_addr._offset = (intx)CompressedOops::encode_not_null((oop)base);
624 } else {
625 si->_addr._offset = 0;
626 }
627 } else {
628 si->_addr._base = base;
629 }
630 si->_used = size;
631 si->_read_only = read_only;
632 si->_allow_exec = allow_exec;
633 si->_crc = ClassLoader::crc32(0, base, (jint)size);
634 if (base != NULL) {
635 write_bytes_aligned(base, (int)size);
636 }
637 }
638
639 // Write out the given archive heap memory regions. GC code combines multiple
640 // consecutive archive GC regions into one MemRegion whenever possible and
641 // produces the 'heap_mem' array.
642 //
643 // If the archive heap memory size is smaller than a single dump time GC region
644 // size, there is only one MemRegion in the array.
645 //
646 // If the archive heap memory size is bigger than one dump time GC region size,
647 // the 'heap_mem' array may contain more than one consolidated MemRegions. When
648 // the first/bottom archive GC region is a partial GC region (with the empty
649 // portion at the higher address within the region), one MemRegion is used for
650 // the bottom partial archive GC region. The rest of the consecutive archive
651 // GC regions are combined into another MemRegion.
652 //
653 // Here's the mapping from (archive heap GC regions) -> (GrowableArray<MemRegion> *regions).
654 // + We have 1 or more archive heap regions: ah0, ah1, ah2 ..... ahn
655 // + We have 1 or 2 consolidated heap memory regions: r0 and r1
681 for (int i = first_region_id, arr_idx = 0;
682 i < first_region_id + max_num_regions;
683 i++, arr_idx++) {
684 char* start = NULL;
685 size_t size = 0;
686 if (arr_idx < arr_len) {
687 start = (char*)heap_mem->at(arr_idx).start();
688 size = heap_mem->at(arr_idx).byte_size();
689 total_size += size;
690 }
691
692 log_info(cds)("Archive heap region %d " INTPTR_FORMAT " - " INTPTR_FORMAT " = " SIZE_FORMAT_W(8) " bytes",
693 i, p2i(start), p2i(start + size), size);
694 write_region(i, start, size, false, false);
695 }
696 return total_size;
697 }
698
699 // Dump bytes to file -- at the current file position.
700
701 void FileMapInfo::write_bytes(const void* buffer, int nbytes) {
702 if (_file_open) {
703 int n = ::write(_fd, buffer, nbytes);
704 if (n != nbytes) {
705 // It is dangerous to leave the corrupted shared archive file around,
706 // close and remove the file. See bug 6372906.
707 close();
708 remove(_full_path);
709 fail_stop("Unable to write to shared archive file.");
710 }
711 }
712 _file_offset += nbytes;
713 }
714
715
716 // Align file position to an allocation unit boundary.
717
718 void FileMapInfo::align_file_position() {
719 size_t new_file_offset = align_up(_file_offset,
720 os::vm_allocation_granularity());
721 if (new_file_offset != _file_offset) {
722 _file_offset = new_file_offset;
723 if (_file_open) {
724 // Seek one byte back from the target and write a byte to insure
725 // that the written file is the correct length.
726 _file_offset -= 1;
727 if (lseek(_fd, (long)_file_offset, SEEK_SET) < 0) {
728 fail_stop("Unable to seek.");
729 }
730 char zero = 0;
731 write_bytes(&zero, 1);
732 }
733 }
734 }
735
736
737 // Dump bytes to file -- at the current file position.
738
739 void FileMapInfo::write_bytes_aligned(const void* buffer, int nbytes) {
740 align_file_position();
741 write_bytes(buffer, nbytes);
742 align_file_position();
743 }
744
745
746 // Close the shared archive file. This does NOT unmap mapped regions.
747
748 void FileMapInfo::close() {
749 if (_file_open) {
750 if (::close(_fd) < 0) {
751 fail_stop("Unable to close the shared archive file.");
752 }
753 _file_open = false;
754 _fd = -1;
755 }
756 }
757
758
759 // JVM/TI RedefineClasses() support:
760 // Remap the shared readonly space to shared readwrite, private.
761 bool FileMapInfo::remap_shared_readonly_as_readwrite() {
762 int idx = MetaspaceShared::ro;
763 struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[idx];
764 if (!si->_read_only) {
765 // the space is already readwrite so we are done
766 return true;
767 }
768 size_t used = si->_used;
769 size_t size = align_up(used, os::vm_allocation_granularity());
770 if (!open_for_read()) {
771 return false;
772 }
773 char *addr = _header->region_addr(idx);
774 char *base = os::remap_memory(_fd, _full_path, si->_file_offset,
775 addr, size, false /* !read_only */,
776 si->_allow_exec);
777 close();
778 if (base == NULL) {
779 fail_continue("Unable to remap shared readonly space (errno=%d).", errno);
780 return false;
781 }
782 if (base != addr) {
783 fail_continue("Unable to remap shared readonly space at required address.");
795 // Reserve the space first, then map otherwise map will go right over some
796 // other reserved memory (like the code cache).
797 ReservedSpace rs(size, os::vm_allocation_granularity(), false, requested_addr);
798 if (!rs.is_reserved()) {
799 fail_continue("Unable to reserve shared space at required address "
800 INTPTR_FORMAT, p2i(requested_addr));
801 return rs;
802 }
803 // the reserved virtual memory is for mapping class data sharing archive
804 MemTracker::record_virtual_memory_type((address)rs.base(), mtClassShared);
805
806 return rs;
807 }
808
809 // Memory map a region in the address space.
810 static const char* shared_region_name[] = { "MiscData", "ReadWrite", "ReadOnly", "MiscCode", "OptionalData",
811 "String1", "String2", "OpenArchive1", "OpenArchive2" };
812
813 char* FileMapInfo::map_region(int i, char** top_ret) {
814 assert(!MetaspaceShared::is_heap_region(i), "sanity");
815 struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
816 size_t used = si->_used;
817 size_t alignment = os::vm_allocation_granularity();
818 size_t size = align_up(used, alignment);
819 char *requested_addr = _header->region_addr(i);
820
821 // If a tool agent is in use (debugging enabled), we must map the address space RW
822 if (JvmtiExport::can_modify_any_class() || JvmtiExport::can_walk_any_space()) {
823 si->_read_only = false;
824 }
825
826 // map the contents of the CDS archive in this memory
827 char *base = os::map_memory(_fd, _full_path, si->_file_offset,
828 requested_addr, size, si->_read_only,
829 si->_allow_exec);
830 if (base == NULL || base != requested_addr) {
831 fail_continue("Unable to map %s shared space at required address.", shared_region_name[i]);
832 return NULL;
833 }
834 #ifdef _WINDOWS
835 // This call is Windows-only because the memory_type gets recorded for the other platforms
862 //
863 // The open archive heap objects are mapped below the shared strings in
864 // the runtime java heap. The mapped open archive heap data only contain
865 // references to the shared strings and open archive objects initially.
866 // During runtime execution, out-going references to any other java heap
867 // regions may be added. GC may mark and update references in the mapped
868 // open archive objects.
869 void FileMapInfo::map_heap_regions() {
870 if (MetaspaceShared::is_heap_object_archiving_allowed()) {
871 log_info(cds)("Archived narrow_oop_mode = %d, narrow_oop_base = " PTR_FORMAT ", narrow_oop_shift = %d",
872 narrow_oop_mode(), p2i(narrow_oop_base()), narrow_oop_shift());
873 log_info(cds)("Archived narrow_klass_base = " PTR_FORMAT ", narrow_klass_shift = %d",
874 p2i(narrow_klass_base()), narrow_klass_shift());
875
876 // Check that all the narrow oop and klass encodings match the archive
877 if (narrow_oop_mode() != Universe::narrow_oop_mode() ||
878 narrow_oop_base() != Universe::narrow_oop_base() ||
879 narrow_oop_shift() != Universe::narrow_oop_shift() ||
880 narrow_klass_base() != Universe::narrow_klass_base() ||
881 narrow_klass_shift() != Universe::narrow_klass_shift()) {
882 if (log_is_enabled(Info, cds) && _header->_space[MetaspaceShared::first_string]._used > 0) {
883 log_info(cds)("Cached heap data from the CDS archive is being ignored. "
884 "The current CompressedOops/CompressedClassPointers encoding differs from "
885 "that archived due to heap size change. The archive was dumped using max heap "
886 "size " UINTX_FORMAT "M.", max_heap_size()/M);
887 log_info(cds)("Current narrow_oop_mode = %d, narrow_oop_base = " PTR_FORMAT ", narrow_oop_shift = %d",
888 Universe::narrow_oop_mode(), p2i(Universe::narrow_oop_base()),
889 Universe::narrow_oop_shift());
890 log_info(cds)("Current narrow_klass_base = " PTR_FORMAT ", narrow_klass_shift = %d",
891 p2i(Universe::narrow_klass_base()), Universe::narrow_klass_shift());
892 }
893 } else {
894 // First, map string regions as closed archive heap regions.
895 // GC does not write into the regions.
896 if (map_heap_data(&string_ranges,
897 MetaspaceShared::first_string,
898 MetaspaceShared::max_strings,
899 &num_string_ranges)) {
900 StringTable::set_shared_string_mapped();
901
902 // Now, map open_archive heap regions, GC can write into the regions.
903 if (map_heap_data(&open_archive_heap_ranges,
904 MetaspaceShared::first_open_archive_heap_region,
905 MetaspaceShared::max_open_archive_heap_region,
906 &num_open_archive_heap_ranges,
907 true /* open */)) {
908 MetaspaceShared::set_open_archive_heap_region_mapped();
909 }
910 }
911 }
912 } else {
913 if (log_is_enabled(Info, cds) && _header->_space[MetaspaceShared::first_string]._used > 0) {
914 log_info(cds)("Cached heap data from the CDS archive is being ignored. UseG1GC, "
915 "UseCompressedOops and UseCompressedClassPointers are required.");
916 }
917 }
918
919 if (!StringTable::shared_string_mapped()) {
920 assert(string_ranges == NULL && num_string_ranges == 0, "sanity");
921 }
922
923 if (!MetaspaceShared::open_archive_heap_region_mapped()) {
924 assert(open_archive_heap_ranges == NULL && num_open_archive_heap_ranges == 0, "sanity");
925 }
926 }
927
928 bool FileMapInfo::map_heap_data(MemRegion **heap_mem, int first,
929 int max, int* num, bool is_open_archive) {
930 MemRegion * regions = new MemRegion[max];
931 struct FileMapInfo::FileMapHeader::space_info* si;
932 int region_num = 0;
933
934 for (int i = first;
935 i < first + max; i++) {
936 si = &_header->_space[i];
937 size_t used = si->_used;
938 if (used > 0) {
939 size_t size = used;
940 char* requested_addr = (char*)((void*)CompressedOops::decode_not_null(
941 (narrowOop)si->_addr._offset));
942 regions[region_num] = MemRegion((HeapWord*)requested_addr, size / HeapWordSize);
943 region_num ++;
944 }
945 }
946
947 if (region_num == 0) {
948 return false; // no archived java heap data
949 }
950
951 // Check that ranges are within the java heap
952 if (!G1CollectedHeap::heap()->check_archive_addresses(regions, region_num)) {
953 log_info(cds)("UseSharedSpaces: Unable to allocate region, "
954 "range is not within java heap.");
955 return false;
956 }
957
958 // allocate from java heap
959 if (!G1CollectedHeap::heap()->alloc_archive_regions(
960 regions, region_num, is_open_archive)) {
961 log_info(cds)("UseSharedSpaces: Unable to allocate region, "
962 "java heap range is already in use.");
963 return false;
964 }
965
966 // Map the archived heap data. No need to call MemTracker::record_virtual_memory_type()
967 // for mapped regions as they are part of the reserved java heap, which is
968 // already recorded.
969 for (int i = 0; i < region_num; i++) {
970 si = &_header->_space[first + i];
971 char* addr = (char*)regions[i].start();
972 char* base = os::map_memory(_fd, _full_path, si->_file_offset,
973 addr, regions[i].byte_size(), si->_read_only,
974 si->_allow_exec);
975 if (base == NULL || base != addr) {
976 // dealloc the regions from java heap
977 dealloc_archive_heap_regions(regions, region_num);
978 log_info(cds)("UseSharedSpaces: Unable to map at required address in java heap.");
979 return false;
980 }
981 }
982
983 if (!verify_mapped_heap_regions(first, region_num)) {
984 // dealloc the regions from java heap
985 dealloc_archive_heap_regions(regions, region_num);
986 log_info(cds)("UseSharedSpaces: mapped heap regions are corrupt");
987 return false;
988 }
989
990 // the shared heap data is mapped successfully
1016 assert(open_archive_heap_ranges != NULL, "NULL open_archive_heap_ranges array with non-zero count");
1017 G1CollectedHeap::heap()->fill_archive_regions(open_archive_heap_ranges,
1018 num_open_archive_heap_ranges);
1019 }
1020 }
1021
1022 // dealloc the archive regions from java heap
1023 void FileMapInfo::dealloc_archive_heap_regions(MemRegion* regions, int num) {
1024 if (num > 0) {
1025 assert(regions != NULL, "Null archive ranges array with non-zero count");
1026 G1CollectedHeap::heap()->dealloc_archive_regions(regions, num);
1027 }
1028 }
1029 #endif // INCLUDE_CDS_JAVA_HEAP
1030
1031 bool FileMapInfo::verify_region_checksum(int i) {
1032 if (!VerifySharedSpaces) {
1033 return true;
1034 }
1035
1036 size_t sz = _header->_space[i]._used;
1037
1038 if (sz == 0) {
1039 return true; // no data
1040 }
1041 if ((MetaspaceShared::is_string_region(i) &&
1042 !StringTable::shared_string_mapped()) ||
1043 (MetaspaceShared::is_open_archive_heap_region(i) &&
1044 !MetaspaceShared::open_archive_heap_region_mapped())) {
1045 return true; // archived heap data is not mapped
1046 }
1047 const char* buf = _header->region_addr(i);
1048 int crc = ClassLoader::crc32(0, buf, (jint)sz);
1049 if (crc != _header->_space[i]._crc) {
1050 fail_continue("Checksum verification failed.");
1051 return false;
1052 }
1053 return true;
1054 }
1055
1056 // Unmap a memory region in the address space.
1057
1058 void FileMapInfo::unmap_region(int i) {
1059 assert(!MetaspaceShared::is_heap_region(i), "sanity");
1060 struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
1061 size_t used = si->_used;
1062 size_t size = align_up(used, os::vm_allocation_granularity());
1063
1064 if (used == 0) {
1065 return;
1066 }
1067
1068 char* addr = _header->region_addr(i);
1069 if (!os::unmap_memory(addr, size)) {
1070 fail_stop("Unable to unmap shared space.");
1071 }
1072 }
1073
1074 void FileMapInfo::assert_mark(bool check) {
1075 if (!check) {
1076 fail_stop("Mark mismatch while restoring from shared file.");
1077 }
1078 }
1079
1080 void FileMapInfo::metaspace_pointers_do(MetaspaceClosure* it) {
1098 //
1099 // Validation of the archive is done in two steps:
1100 //
1101 // [1] validate_header() - done here. This checks the header, including _paths_misc_info.
1102 // [2] validate_shared_path_table - this is done later, because the table is in the RW
1103 // region of the archive, which is not mapped yet.
1104 bool FileMapInfo::initialize() {
1105 assert(UseSharedSpaces, "UseSharedSpaces expected.");
1106
1107 if (!open_for_read()) {
1108 return false;
1109 }
1110
1111 init_from_file(_fd);
1112 if (!validate_header()) {
1113 return false;
1114 }
1115 return true;
1116 }
1117
1118 char* FileMapInfo::FileMapHeader::region_addr(int idx) {
1119 if (MetaspaceShared::is_heap_region(idx)) {
1120 return _space[idx]._used > 0 ?
1121 (char*)((void*)CompressedOops::decode_not_null((narrowOop)_space[idx]._addr._offset)) : NULL;
1122 } else {
1123 return _space[idx]._addr._base;
1124 }
1125 }
1126
1127 int FileMapInfo::FileMapHeader::compute_crc() {
1128 char* header = data();
1129 // start computing from the field after _crc
1130 char* buf = (char*)&_crc + sizeof(int);
1131 size_t sz = data_size() - (buf - header);
1132 int crc = ClassLoader::crc32(0, buf, (jint)sz);
1133 return crc;
1134 }
1135
1136 // This function should only be called during run time with UseSharedSpaces enabled.
1137 bool FileMapInfo::FileMapHeader::validate() {
1138 if (VerifySharedSpaces && compute_crc() != _crc) {
1139 fail_continue("Header checksum verification failed.");
1140 return false;
1141 }
1142
1143 if (!Arguments::has_jimage()) {
1144 FileMapInfo::fail_continue("The shared archive file cannot be used with an exploded module build.");
1145 return false;
1146 }
1147
1148 if (_version != current_version()) {
1149 FileMapInfo::fail_continue("The shared archive file is the wrong version.");
1150 return false;
1151 }
1152 if (_magic != (int)0xf00baba2) {
1153 FileMapInfo::fail_continue("The shared archive file has a bad magic number.");
1154 return false;
1155 }
1156 char header_version[JVM_IDENT_MAX];
1157 get_header_version(header_version);
1158 if (strncmp(_jvm_ident, header_version, JVM_IDENT_MAX-1) != 0) {
1159 log_info(class, path)("expected: %s", header_version);
1160 log_info(class, path)("actual: %s", _jvm_ident);
1161 FileMapInfo::fail_continue("The shared archive file was created by a different"
1162 " version or build of HotSpot");
1163 return false;
1164 }
1165 if (_obj_alignment != ObjectAlignmentInBytes) {
1166 FileMapInfo::fail_continue("The shared archive file's ObjectAlignmentInBytes of %d"
1167 " does not equal the current ObjectAlignmentInBytes of " INTX_FORMAT ".",
1168 _obj_alignment, ObjectAlignmentInBytes);
1169 return false;
1170 }
1171 if (_compact_strings != CompactStrings) {
1172 FileMapInfo::fail_continue("The shared archive file's CompactStrings setting (%s)"
1208 fail_continue("shared class paths mismatch (hint: enable -Xlog:class+path=info to diagnose the failure)");
1209 status = false;
1210 }
1211 }
1212 }
1213
1214 if (_paths_misc_info != NULL) {
1215 FREE_C_HEAP_ARRAY(char, _paths_misc_info);
1216 _paths_misc_info = NULL;
1217 }
1218 return status;
1219 }
1220
1221 // Check if a given address is within one of the shared regions
1222 bool FileMapInfo::is_in_shared_region(const void* p, int idx) {
1223 assert(idx == MetaspaceShared::ro ||
1224 idx == MetaspaceShared::rw ||
1225 idx == MetaspaceShared::mc ||
1226 idx == MetaspaceShared::md, "invalid region index");
1227 char* base = _header->region_addr(idx);
1228 if (p >= base && p < base + _header->_space[idx]._used) {
1229 return true;
1230 }
1231 return false;
1232 }
1233
1234 void FileMapInfo::print_shared_spaces() {
1235 tty->print_cr("Shared Spaces:");
1236 for (int i = 0; i < MetaspaceShared::n_regions; i++) {
1237 struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
1238 char *base = _header->region_addr(i);
1239 tty->print(" %s " INTPTR_FORMAT "-" INTPTR_FORMAT,
1240 shared_region_name[i],
1241 p2i(base), p2i(base + si->_used));
1242 }
1243 }
1244
1245 // Unmap mapped regions of shared space.
1246 void FileMapInfo::stop_sharing_and_unmap(const char* msg) {
1247 FileMapInfo *map_info = FileMapInfo::current_info();
1248 if (map_info) {
1249 map_info->fail_continue("%s", msg);
1250 for (int i = 0; i < MetaspaceShared::num_non_heap_spaces; i++) {
1251 char *addr = map_info->_header->region_addr(i);
1252 if (addr != NULL && !MetaspaceShared::is_heap_region(i)) {
1253 map_info->unmap_region(i);
1254 map_info->_header->_space[i]._addr._base = NULL;
1255 }
1256 }
1257 // Dealloc the archive heap regions only without unmapping. The regions are part
1258 // of the java heap. Unmapping of the heap regions are managed by GC.
1259 map_info->dealloc_archive_heap_regions(open_archive_heap_ranges,
1260 num_open_archive_heap_ranges);
1261 map_info->dealloc_archive_heap_regions(string_ranges, num_string_ranges);
1262 } else if (DumpSharedSpaces) {
1263 fail_stop("%s", msg);
1264 }
1265 }
|
142 } else {
143 // Get the hash value. Use a static seed because the hash needs to return the same
144 // value over multiple jvm invocations.
145 unsigned int hash = AltHashing::murmur3_32(8191, (const jbyte*)vm_version, version_len);
146
147 // Truncate the ident, saving room for the 8 hex character hash value.
148 strncpy(header_version, vm_version, JVM_IDENT_MAX-9);
149
150 // Append the hash code as eight hex digits.
151 sprintf(&header_version[JVM_IDENT_MAX-9], "%08x", hash);
152 header_version[JVM_IDENT_MAX-1] = 0; // Null terminate.
153 }
154 }
155
156 FileMapInfo::FileMapInfo() {
157 assert(_current_info == NULL, "must be singleton"); // not thread safe
158 _current_info = this;
159 memset((void*)this, 0, sizeof(FileMapInfo));
160 _file_offset = 0;
161 _file_open = false;
162 _header = (FileMapHeader*)os::malloc(sizeof(FileMapHeader), mtInternal);
163 _header->_version = INVALID_CDS_ARCHIVE_VERSION;
164 _header->_has_platform_or_app_classes = true;
165 }
166
167 FileMapInfo::~FileMapInfo() {
168 assert(_current_info == this, "must be singleton"); // not thread safe
169 _current_info = NULL;
170 }
171
172 void FileMapInfo::populate_header(size_t alignment) {
173 _header->populate(this, alignment);
174 }
175
176 void FileMapHeader::populate(FileMapInfo* mapinfo, size_t alignment) {
177 _magic = CDS_ARCHIVE_MAGIC;
178 _version = CURRENT_CDS_ARCHIVE_VERSION;
179 _alignment = alignment;
180 _obj_alignment = ObjectAlignmentInBytes;
181 _compact_strings = CompactStrings;
182 _narrow_oop_mode = Universe::narrow_oop_mode();
183 _narrow_oop_base = Universe::narrow_oop_base();
184 _narrow_oop_shift = Universe::narrow_oop_shift();
185 _max_heap_size = MaxHeapSize;
186 _narrow_klass_base = Universe::narrow_klass_base();
187 _narrow_klass_shift = Universe::narrow_klass_shift();
188 _shared_path_table_size = mapinfo->_shared_path_table_size;
189 _shared_path_table = mapinfo->_shared_path_table;
190 _shared_path_entry_size = mapinfo->_shared_path_entry_size;
191
192 // The following fields are for sanity checks for whether this archive
193 // will function correctly with this JVM and the bootclasspath it's
194 // invoked with.
195
196 // JVM version string ... changes on each build.
197 get_header_version(_jvm_ident);
198
480 }
481 } else if (i >= module_paths_start_index) {
482 if (shared_path(i)->validate(false /* not a class path entry */)) {
483 log_info(class, path)("ok");
484 }
485 } else if (!PrintSharedArchiveAndExit) {
486 _validating_shared_path_table = false;
487 _shared_path_table = NULL;
488 _shared_path_table_size = 0;
489 return false;
490 }
491 }
492
493 _validating_shared_path_table = false;
494 return true;
495 }
496
497 // Read the FileMapInfo information from the file.
498
499 bool FileMapInfo::init_from_file(int fd) {
500 size_t sz = sizeof(FileMapHeader);
501 size_t n = os::read(fd, _header, (unsigned int)sz);
502 if (n != sz) {
503 fail_continue("Unable to read the file header.");
504 return false;
505 }
506 if (_header->_version != CURRENT_CDS_ARCHIVE_VERSION) {
507 fail_continue("The shared archive file has the wrong version.");
508 return false;
509 }
510 _file_offset = (long)n;
511
512 size_t info_size = _header->_paths_misc_info_size;
513 _paths_misc_info = NEW_C_HEAP_ARRAY_RETURN_NULL(char, info_size, mtClass);
514 if (_paths_misc_info == NULL) {
515 fail_continue("Unable to read the file header.");
516 return false;
517 }
518 n = os::read(fd, _paths_misc_info, (unsigned int)info_size);
519 if (n != info_size) {
520 fail_continue("Unable to read the shared path info header.");
521 FREE_C_HEAP_ARRAY(char, _paths_misc_info);
522 _paths_misc_info = NULL;
523 return false;
524 }
525
526 size_t len = lseek(fd, 0, SEEK_END);
527 CDSFileMapRegion* si = space_at(MetaspaceShared::last_valid_region);
528 // The last space might be empty
529 if (si->_file_offset > len || len - si->_file_offset < si->_used) {
530 fail_continue("The shared archive file has been truncated.");
531 return false;
532 }
533
534 _file_offset += (long)n;
535 return true;
536 }
537
538
539 // Read the FileMapInfo information from the file.
540 bool FileMapInfo::open_for_read() {
541 _full_path = Arguments::GetSharedArchivePath();
542 int fd = open(_full_path, O_RDONLY | O_BINARY, 0);
543 if (fd < 0) {
544 if (errno == ENOENT) {
545 // Not locating the shared archive is ok.
546 fail_continue("Specified shared archive not found.");
547 } else {
576 remove(_full_path);
577 int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0444);
578 if (fd < 0) {
579 fail_stop("Unable to create shared archive file %s: (%s).", _full_path,
580 os::strerror(errno));
581 }
582 _fd = fd;
583 _file_offset = 0;
584 _file_open = true;
585 }
586
587
588 // Write the header to the file, seek to the next allocation boundary.
589
590 void FileMapInfo::write_header() {
591 int info_size = ClassLoader::get_shared_paths_misc_info_size();
592
593 _header->_paths_misc_info_size = info_size;
594
595 align_file_position();
596 write_bytes(_header, sizeof(FileMapHeader));
597 write_bytes(ClassLoader::get_shared_paths_misc_info(), (size_t)info_size);
598 align_file_position();
599 }
600
601
602 // Dump region to file.
603
604 void FileMapInfo::write_region(int region, char* base, size_t size,
605 bool read_only, bool allow_exec) {
606 CDSFileMapRegion* si = space_at(region);
607
608 if (_file_open) {
609 guarantee(si->_file_offset == _file_offset, "file offset mismatch.");
610 log_info(cds)("Shared file region %d: " SIZE_FORMAT_HEX_W(08)
611 " bytes, addr " INTPTR_FORMAT " file offset " SIZE_FORMAT_HEX_W(08),
612 region, size, p2i(base), _file_offset);
613 } else {
614 si->_file_offset = _file_offset;
615 }
616 if (MetaspaceShared::is_heap_region(region)) {
617 assert((base - (char*)Universe::narrow_oop_base()) % HeapWordSize == 0, "Sanity");
618 if (base != NULL) {
619 si->_addr._offset = (intx)CompressedOops::encode_not_null((oop)base);
620 } else {
621 si->_addr._offset = 0;
622 }
623 } else {
624 si->_addr._base = base;
625 }
626 si->_used = size;
627 si->_read_only = read_only;
628 si->_allow_exec = allow_exec;
629 si->_crc = ClassLoader::crc32(0, base, (jint)size);
630 if (base != NULL) {
631 write_bytes_aligned(base, size);
632 }
633 }
634
635 // Write out the given archive heap memory regions. GC code combines multiple
636 // consecutive archive GC regions into one MemRegion whenever possible and
637 // produces the 'heap_mem' array.
638 //
639 // If the archive heap memory size is smaller than a single dump time GC region
640 // size, there is only one MemRegion in the array.
641 //
642 // If the archive heap memory size is bigger than one dump time GC region size,
643 // the 'heap_mem' array may contain more than one consolidated MemRegions. When
644 // the first/bottom archive GC region is a partial GC region (with the empty
645 // portion at the higher address within the region), one MemRegion is used for
646 // the bottom partial archive GC region. The rest of the consecutive archive
647 // GC regions are combined into another MemRegion.
648 //
649 // Here's the mapping from (archive heap GC regions) -> (GrowableArray<MemRegion> *regions).
650 // + We have 1 or more archive heap regions: ah0, ah1, ah2 ..... ahn
651 // + We have 1 or 2 consolidated heap memory regions: r0 and r1
677 for (int i = first_region_id, arr_idx = 0;
678 i < first_region_id + max_num_regions;
679 i++, arr_idx++) {
680 char* start = NULL;
681 size_t size = 0;
682 if (arr_idx < arr_len) {
683 start = (char*)heap_mem->at(arr_idx).start();
684 size = heap_mem->at(arr_idx).byte_size();
685 total_size += size;
686 }
687
688 log_info(cds)("Archive heap region %d " INTPTR_FORMAT " - " INTPTR_FORMAT " = " SIZE_FORMAT_W(8) " bytes",
689 i, p2i(start), p2i(start + size), size);
690 write_region(i, start, size, false, false);
691 }
692 return total_size;
693 }
694
695 // Dump bytes to file -- at the current file position.
696
697 void FileMapInfo::write_bytes(const void* buffer, size_t nbytes) {
698 if (_file_open) {
699 size_t n = os::write(_fd, buffer, (unsigned int)nbytes);
700 if (n != nbytes) {
701 // It is dangerous to leave the corrupted shared archive file around,
702 // close and remove the file. See bug 6372906.
703 close();
704 remove(_full_path);
705 fail_stop("Unable to write to shared archive file.");
706 }
707 }
708 _file_offset += nbytes;
709 }
710
711
712 // Align file position to an allocation unit boundary.
713
714 void FileMapInfo::align_file_position() {
715 size_t new_file_offset = align_up(_file_offset,
716 os::vm_allocation_granularity());
717 if (new_file_offset != _file_offset) {
718 _file_offset = new_file_offset;
719 if (_file_open) {
720 // Seek one byte back from the target and write a byte to insure
721 // that the written file is the correct length.
722 _file_offset -= 1;
723 if (lseek(_fd, (long)_file_offset, SEEK_SET) < 0) {
724 fail_stop("Unable to seek.");
725 }
726 char zero = 0;
727 write_bytes(&zero, 1);
728 }
729 }
730 }
731
732
733 // Dump bytes to file -- at the current file position.
734
735 void FileMapInfo::write_bytes_aligned(const void* buffer, size_t nbytes) {
736 align_file_position();
737 write_bytes(buffer, nbytes);
738 align_file_position();
739 }
740
741
742 // Close the shared archive file. This does NOT unmap mapped regions.
743
744 void FileMapInfo::close() {
745 if (_file_open) {
746 if (::close(_fd) < 0) {
747 fail_stop("Unable to close the shared archive file.");
748 }
749 _file_open = false;
750 _fd = -1;
751 }
752 }
753
754
755 // JVM/TI RedefineClasses() support:
756 // Remap the shared readonly space to shared readwrite, private.
757 bool FileMapInfo::remap_shared_readonly_as_readwrite() {
758 int idx = MetaspaceShared::ro;
759 CDSFileMapRegion* si = space_at(idx);
760 if (!si->_read_only) {
761 // the space is already readwrite so we are done
762 return true;
763 }
764 size_t used = si->_used;
765 size_t size = align_up(used, os::vm_allocation_granularity());
766 if (!open_for_read()) {
767 return false;
768 }
769 char *addr = _header->region_addr(idx);
770 char *base = os::remap_memory(_fd, _full_path, si->_file_offset,
771 addr, size, false /* !read_only */,
772 si->_allow_exec);
773 close();
774 if (base == NULL) {
775 fail_continue("Unable to remap shared readonly space (errno=%d).", errno);
776 return false;
777 }
778 if (base != addr) {
779 fail_continue("Unable to remap shared readonly space at required address.");
791 // Reserve the space first, then map otherwise map will go right over some
792 // other reserved memory (like the code cache).
793 ReservedSpace rs(size, os::vm_allocation_granularity(), false, requested_addr);
794 if (!rs.is_reserved()) {
795 fail_continue("Unable to reserve shared space at required address "
796 INTPTR_FORMAT, p2i(requested_addr));
797 return rs;
798 }
799 // the reserved virtual memory is for mapping class data sharing archive
800 MemTracker::record_virtual_memory_type((address)rs.base(), mtClassShared);
801
802 return rs;
803 }
804
805 // Memory map a region in the address space.
806 static const char* shared_region_name[] = { "MiscData", "ReadWrite", "ReadOnly", "MiscCode", "OptionalData",
807 "String1", "String2", "OpenArchive1", "OpenArchive2" };
808
809 char* FileMapInfo::map_region(int i, char** top_ret) {
810 assert(!MetaspaceShared::is_heap_region(i), "sanity");
811 CDSFileMapRegion* si = space_at(i);
812 size_t used = si->_used;
813 size_t alignment = os::vm_allocation_granularity();
814 size_t size = align_up(used, alignment);
815 char *requested_addr = _header->region_addr(i);
816
817 // If a tool agent is in use (debugging enabled), we must map the address space RW
818 if (JvmtiExport::can_modify_any_class() || JvmtiExport::can_walk_any_space()) {
819 si->_read_only = false;
820 }
821
822 // map the contents of the CDS archive in this memory
823 char *base = os::map_memory(_fd, _full_path, si->_file_offset,
824 requested_addr, size, si->_read_only,
825 si->_allow_exec);
826 if (base == NULL || base != requested_addr) {
827 fail_continue("Unable to map %s shared space at required address.", shared_region_name[i]);
828 return NULL;
829 }
830 #ifdef _WINDOWS
831 // This call is Windows-only because the memory_type gets recorded for the other platforms
858 //
859 // The open archive heap objects are mapped below the shared strings in
860 // the runtime java heap. The mapped open archive heap data only contain
861 // references to the shared strings and open archive objects initially.
862 // During runtime execution, out-going references to any other java heap
863 // regions may be added. GC may mark and update references in the mapped
864 // open archive objects.
865 void FileMapInfo::map_heap_regions() {
866 if (MetaspaceShared::is_heap_object_archiving_allowed()) {
867 log_info(cds)("Archived narrow_oop_mode = %d, narrow_oop_base = " PTR_FORMAT ", narrow_oop_shift = %d",
868 narrow_oop_mode(), p2i(narrow_oop_base()), narrow_oop_shift());
869 log_info(cds)("Archived narrow_klass_base = " PTR_FORMAT ", narrow_klass_shift = %d",
870 p2i(narrow_klass_base()), narrow_klass_shift());
871
872 // Check that all the narrow oop and klass encodings match the archive
873 if (narrow_oop_mode() != Universe::narrow_oop_mode() ||
874 narrow_oop_base() != Universe::narrow_oop_base() ||
875 narrow_oop_shift() != Universe::narrow_oop_shift() ||
876 narrow_klass_base() != Universe::narrow_klass_base() ||
877 narrow_klass_shift() != Universe::narrow_klass_shift()) {
878 if (log_is_enabled(Info, cds) && space_at(MetaspaceShared::first_string)->_used > 0) {
879 log_info(cds)("Cached heap data from the CDS archive is being ignored. "
880 "The current CompressedOops/CompressedClassPointers encoding differs from "
881 "that archived due to heap size change. The archive was dumped using max heap "
882 "size " UINTX_FORMAT "M.", max_heap_size()/M);
883 log_info(cds)("Current narrow_oop_mode = %d, narrow_oop_base = " PTR_FORMAT ", narrow_oop_shift = %d",
884 Universe::narrow_oop_mode(), p2i(Universe::narrow_oop_base()),
885 Universe::narrow_oop_shift());
886 log_info(cds)("Current narrow_klass_base = " PTR_FORMAT ", narrow_klass_shift = %d",
887 p2i(Universe::narrow_klass_base()), Universe::narrow_klass_shift());
888 }
889 } else {
890 // First, map string regions as closed archive heap regions.
891 // GC does not write into the regions.
892 if (map_heap_data(&string_ranges,
893 MetaspaceShared::first_string,
894 MetaspaceShared::max_strings,
895 &num_string_ranges)) {
896 StringTable::set_shared_string_mapped();
897
898 // Now, map open_archive heap regions, GC can write into the regions.
899 if (map_heap_data(&open_archive_heap_ranges,
900 MetaspaceShared::first_open_archive_heap_region,
901 MetaspaceShared::max_open_archive_heap_region,
902 &num_open_archive_heap_ranges,
903 true /* open */)) {
904 MetaspaceShared::set_open_archive_heap_region_mapped();
905 }
906 }
907 }
908 } else {
909 if (log_is_enabled(Info, cds) && space_at(MetaspaceShared::first_string)->_used > 0) {
910 log_info(cds)("Cached heap data from the CDS archive is being ignored. UseG1GC, "
911 "UseCompressedOops and UseCompressedClassPointers are required.");
912 }
913 }
914
915 if (!StringTable::shared_string_mapped()) {
916 assert(string_ranges == NULL && num_string_ranges == 0, "sanity");
917 }
918
919 if (!MetaspaceShared::open_archive_heap_region_mapped()) {
920 assert(open_archive_heap_ranges == NULL && num_open_archive_heap_ranges == 0, "sanity");
921 }
922 }
923
924 bool FileMapInfo::map_heap_data(MemRegion **heap_mem, int first,
925 int max, int* num, bool is_open_archive) {
926 MemRegion * regions = new MemRegion[max];
927 CDSFileMapRegion* si;
928 int region_num = 0;
929
930 for (int i = first;
931 i < first + max; i++) {
932 si = space_at(i);
933 size_t used = si->_used;
934 if (used > 0) {
935 size_t size = used;
936 char* requested_addr = (char*)((void*)CompressedOops::decode_not_null(
937 (narrowOop)si->_addr._offset));
938 regions[region_num] = MemRegion((HeapWord*)requested_addr, size / HeapWordSize);
939 region_num ++;
940 }
941 }
942
943 if (region_num == 0) {
944 return false; // no archived java heap data
945 }
946
947 // Check that ranges are within the java heap
948 if (!G1CollectedHeap::heap()->check_archive_addresses(regions, region_num)) {
949 log_info(cds)("UseSharedSpaces: Unable to allocate region, "
950 "range is not within java heap.");
951 return false;
952 }
953
954 // allocate from java heap
955 if (!G1CollectedHeap::heap()->alloc_archive_regions(
956 regions, region_num, is_open_archive)) {
957 log_info(cds)("UseSharedSpaces: Unable to allocate region, "
958 "java heap range is already in use.");
959 return false;
960 }
961
962 // Map the archived heap data. No need to call MemTracker::record_virtual_memory_type()
963 // for mapped regions as they are part of the reserved java heap, which is
964 // already recorded.
965 for (int i = 0; i < region_num; i++) {
966 si = space_at(first + i);
967 char* addr = (char*)regions[i].start();
968 char* base = os::map_memory(_fd, _full_path, si->_file_offset,
969 addr, regions[i].byte_size(), si->_read_only,
970 si->_allow_exec);
971 if (base == NULL || base != addr) {
972 // dealloc the regions from java heap
973 dealloc_archive_heap_regions(regions, region_num);
974 log_info(cds)("UseSharedSpaces: Unable to map at required address in java heap.");
975 return false;
976 }
977 }
978
979 if (!verify_mapped_heap_regions(first, region_num)) {
980 // dealloc the regions from java heap
981 dealloc_archive_heap_regions(regions, region_num);
982 log_info(cds)("UseSharedSpaces: mapped heap regions are corrupt");
983 return false;
984 }
985
986 // the shared heap data is mapped successfully
1012 assert(open_archive_heap_ranges != NULL, "NULL open_archive_heap_ranges array with non-zero count");
1013 G1CollectedHeap::heap()->fill_archive_regions(open_archive_heap_ranges,
1014 num_open_archive_heap_ranges);
1015 }
1016 }
1017
1018 // dealloc the archive regions from java heap
1019 void FileMapInfo::dealloc_archive_heap_regions(MemRegion* regions, int num) {
1020 if (num > 0) {
1021 assert(regions != NULL, "Null archive ranges array with non-zero count");
1022 G1CollectedHeap::heap()->dealloc_archive_regions(regions, num);
1023 }
1024 }
1025 #endif // INCLUDE_CDS_JAVA_HEAP
1026
1027 bool FileMapInfo::verify_region_checksum(int i) {
1028 if (!VerifySharedSpaces) {
1029 return true;
1030 }
1031
1032 size_t sz = space_at(i)->_used;
1033
1034 if (sz == 0) {
1035 return true; // no data
1036 }
1037 if ((MetaspaceShared::is_string_region(i) &&
1038 !StringTable::shared_string_mapped()) ||
1039 (MetaspaceShared::is_open_archive_heap_region(i) &&
1040 !MetaspaceShared::open_archive_heap_region_mapped())) {
1041 return true; // archived heap data is not mapped
1042 }
1043 const char* buf = _header->region_addr(i);
1044 int crc = ClassLoader::crc32(0, buf, (jint)sz);
1045 if (crc != space_at(i)->_crc) {
1046 fail_continue("Checksum verification failed.");
1047 return false;
1048 }
1049 return true;
1050 }
1051
1052 // Unmap a memory region in the address space.
1053
1054 void FileMapInfo::unmap_region(int i) {
1055 assert(!MetaspaceShared::is_heap_region(i), "sanity");
1056 CDSFileMapRegion* si = space_at(i);
1057 size_t used = si->_used;
1058 size_t size = align_up(used, os::vm_allocation_granularity());
1059
1060 if (used == 0) {
1061 return;
1062 }
1063
1064 char* addr = _header->region_addr(i);
1065 if (!os::unmap_memory(addr, size)) {
1066 fail_stop("Unable to unmap shared space.");
1067 }
1068 }
1069
1070 void FileMapInfo::assert_mark(bool check) {
1071 if (!check) {
1072 fail_stop("Mark mismatch while restoring from shared file.");
1073 }
1074 }
1075
1076 void FileMapInfo::metaspace_pointers_do(MetaspaceClosure* it) {
1094 //
1095 // Validation of the archive is done in two steps:
1096 //
1097 // [1] validate_header() - done here. This checks the header, including _paths_misc_info.
1098 // [2] validate_shared_path_table - this is done later, because the table is in the RW
1099 // region of the archive, which is not mapped yet.
1100 bool FileMapInfo::initialize() {
1101 assert(UseSharedSpaces, "UseSharedSpaces expected.");
1102
1103 if (!open_for_read()) {
1104 return false;
1105 }
1106
1107 init_from_file(_fd);
1108 if (!validate_header()) {
1109 return false;
1110 }
1111 return true;
1112 }
1113
1114 char* FileMapHeader::region_addr(int idx) {
1115 if (MetaspaceShared::is_heap_region(idx)) {
1116 return _space[idx]._used > 0 ?
1117 (char*)((void*)CompressedOops::decode_not_null((narrowOop)_space[idx]._addr._offset)) : NULL;
1118 } else {
1119 return _space[idx]._addr._base;
1120 }
1121 }
1122
1123 int FileMapHeader::compute_crc() {
1124 char* start = (char*)this;
1125 // start computing from the field after _crc
1126 char* buf = (char*)&_crc + sizeof(_crc);
1127 size_t sz = sizeof(FileMapHeader) - (buf - start);
1128 int crc = ClassLoader::crc32(0, buf, (jint)sz);
1129 return crc;
1130 }
1131
1132 // This function should only be called during run time with UseSharedSpaces enabled.
1133 bool FileMapHeader::validate() {
1134 if (VerifySharedSpaces && compute_crc() != _crc) {
1135 FileMapInfo::fail_continue("Header checksum verification failed.");
1136 return false;
1137 }
1138
1139 if (!Arguments::has_jimage()) {
1140 FileMapInfo::fail_continue("The shared archive file cannot be used with an exploded module build.");
1141 return false;
1142 }
1143
1144 if (_version != CURRENT_CDS_ARCHIVE_VERSION) {
1145 FileMapInfo::fail_continue("The shared archive file is the wrong version.");
1146 return false;
1147 }
1148 if (_magic != CDS_ARCHIVE_MAGIC) {
1149 FileMapInfo::fail_continue("The shared archive file has a bad magic number.");
1150 return false;
1151 }
1152 char header_version[JVM_IDENT_MAX];
1153 get_header_version(header_version);
1154 if (strncmp(_jvm_ident, header_version, JVM_IDENT_MAX-1) != 0) {
1155 log_info(class, path)("expected: %s", header_version);
1156 log_info(class, path)("actual: %s", _jvm_ident);
1157 FileMapInfo::fail_continue("The shared archive file was created by a different"
1158 " version or build of HotSpot");
1159 return false;
1160 }
1161 if (_obj_alignment != ObjectAlignmentInBytes) {
1162 FileMapInfo::fail_continue("The shared archive file's ObjectAlignmentInBytes of %d"
1163 " does not equal the current ObjectAlignmentInBytes of " INTX_FORMAT ".",
1164 _obj_alignment, ObjectAlignmentInBytes);
1165 return false;
1166 }
1167 if (_compact_strings != CompactStrings) {
1168 FileMapInfo::fail_continue("The shared archive file's CompactStrings setting (%s)"
1204 fail_continue("shared class paths mismatch (hint: enable -Xlog:class+path=info to diagnose the failure)");
1205 status = false;
1206 }
1207 }
1208 }
1209
1210 if (_paths_misc_info != NULL) {
1211 FREE_C_HEAP_ARRAY(char, _paths_misc_info);
1212 _paths_misc_info = NULL;
1213 }
1214 return status;
1215 }
1216
1217 // Check if a given address is within one of the shared regions
1218 bool FileMapInfo::is_in_shared_region(const void* p, int idx) {
1219 assert(idx == MetaspaceShared::ro ||
1220 idx == MetaspaceShared::rw ||
1221 idx == MetaspaceShared::mc ||
1222 idx == MetaspaceShared::md, "invalid region index");
1223 char* base = _header->region_addr(idx);
1224 if (p >= base && p < base + space_at(idx)->_used) {
1225 return true;
1226 }
1227 return false;
1228 }
1229
1230 void FileMapInfo::print_shared_spaces() {
1231 tty->print_cr("Shared Spaces:");
1232 for (int i = 0; i < MetaspaceShared::n_regions; i++) {
1233 CDSFileMapRegion* si = space_at(i);
1234 char *base = _header->region_addr(i);
1235 tty->print(" %s " INTPTR_FORMAT "-" INTPTR_FORMAT,
1236 shared_region_name[i],
1237 p2i(base), p2i(base + si->_used));
1238 }
1239 }
1240
1241 // Unmap mapped regions of shared space.
1242 void FileMapInfo::stop_sharing_and_unmap(const char* msg) {
1243 FileMapInfo *map_info = FileMapInfo::current_info();
1244 if (map_info) {
1245 map_info->fail_continue("%s", msg);
1246 for (int i = 0; i < MetaspaceShared::num_non_heap_spaces; i++) {
1247 char *addr = map_info->_header->region_addr(i);
1248 if (addr != NULL && !MetaspaceShared::is_heap_region(i)) {
1249 map_info->unmap_region(i);
1250 map_info->space_at(i)->_addr._base = NULL;
1251 }
1252 }
1253 // Dealloc the archive heap regions only without unmapping. The regions are part
1254 // of the java heap. Unmapping of the heap regions are managed by GC.
1255 map_info->dealloc_archive_heap_regions(open_archive_heap_ranges,
1256 num_open_archive_heap_ranges);
1257 map_info->dealloc_archive_heap_regions(string_ranges, num_string_ranges);
1258 } else if (DumpSharedSpaces) {
1259 fail_stop("%s", msg);
1260 }
1261 }
|