--- old/src/share/vm/memory/metaspaceShared.cpp 2017-08-08 17:40:58.089084948 -0400 +++ new/src/share/vm/memory/metaspaceShared.cpp 2017-08-08 17:40:55.816955822 -0400 @@ -202,8 +202,9 @@ } }; + DumpRegion _mc_region("mc"), _ro_region("ro"), _rw_region("rw"), _md_region("md"), _od_region("od"); -DumpRegion _s0_region("s0"), _s1_region("s1"), _oa0_region("oa0"), _oa1_region("oa1"); +size_t _total_string_region_size = 0, _total_open_archive_region_size = 0; char* MetaspaceShared::misc_code_space_alloc(size_t num_bytes) { return _mc_region.allocate(num_bytes); @@ -870,6 +871,8 @@ void dump_symbols(); char* dump_read_only_tables(); void print_region_stats(); + void print_heap_region_stats(GrowableArray *heap_mem, + const char *name, const size_t total_size); public: VMOp_Type type() const { return VMOp_PopulateDumpSharedSpace; } @@ -1267,11 +1270,6 @@ mapinfo->set_cds_i2i_entry_code_buffers_size(MetaspaceShared::cds_i2i_entry_code_buffers_size()); mapinfo->set_core_spaces_size(core_spaces_size); - char* s0_start, *s0_top; - char* s1_start, *s1_top; - char* oa0_start, *oa0_top; - char* oa1_start, *oa1_top; - for (int pass=1; pass<=2; pass++) { if (pass == 1) { // The first pass doesn't actually write the data to disk. All it @@ -1293,16 +1291,14 @@ write_region(mapinfo, MetaspaceShared::md, &_md_region, /*read_only=*/false,/*allow_exec=*/false); write_region(mapinfo, MetaspaceShared::od, &_od_region, /*read_only=*/true, /*allow_exec=*/false); - mapinfo->write_archive_heap_regions(_string_regions, + _total_string_region_size = mapinfo->write_archive_heap_regions( + _string_regions, MetaspaceShared::first_string, - MetaspaceShared::max_strings, - &s0_start, &s0_top, - &s1_start, &s1_top); - mapinfo->write_archive_heap_regions(_open_archive_heap_regions, + MetaspaceShared::max_strings); + _total_open_archive_region_size = mapinfo->write_archive_heap_regions( + _open_archive_heap_regions, MetaspaceShared::first_open_archive_heap_region, - MetaspaceShared::max_open_archive_heap_region, - &oa0_start, &oa0_top, - &oa1_start, &oa1_top); + MetaspaceShared::max_open_archive_heap_region); } mapinfo->close(); @@ -1310,10 +1306,6 @@ // Restore the vtable in case we invoke any virtual methods. MetaspaceShared::clone_cpp_vtables((intptr_t*)vtbl_list); - _s0_region.init(s0_start, s0_top, s0_top); - _s1_region.init(s1_start, s1_top, s1_top); - _oa0_region.init(oa0_start, oa0_top, oa0_top); - _oa1_region.init(oa1_start, oa1_top, oa1_top); print_region_stats(); if (log_is_enabled(Info, cds)) { @@ -1327,13 +1319,13 @@ const size_t total_reserved = _ro_region.reserved() + _rw_region.reserved() + _mc_region.reserved() + _md_region.reserved() + _od_region.reserved() + - _s0_region.reserved() + _s1_region.reserved() + - _oa0_region.reserved() + _oa1_region.reserved(); + _total_string_region_size + + _total_open_archive_region_size; const size_t total_bytes = _ro_region.used() + _rw_region.used() + _mc_region.used() + _md_region.used() + _od_region.used() + - _s0_region.used() + _s1_region.used() + - _oa0_region.used() + _oa1_region.used(); + _total_string_region_size + + _total_open_archive_region_size; const double total_u_perc = total_bytes / double(total_reserved) * 100.0; _mc_region.print(total_reserved); @@ -1341,15 +1333,25 @@ _ro_region.print(total_reserved); _md_region.print(total_reserved); _od_region.print(total_reserved); - _s0_region.print(total_reserved); - _s1_region.print(total_reserved); - _oa0_region.print(total_reserved); - _oa1_region.print(total_reserved); + print_heap_region_stats(_string_regions, "st", total_reserved); + print_heap_region_stats(_open_archive_heap_regions, "oa", total_reserved); tty->print_cr("total : " SIZE_FORMAT_W(9) " [100.0%% of total] out of " SIZE_FORMAT_W(9) " bytes [%5.1f%% used]", total_bytes, total_reserved, total_u_perc); } +void VM_PopulateDumpSharedSpace::print_heap_region_stats(GrowableArray *heap_mem, + const char *name, const size_t total_size) { + int arr_len = heap_mem == NULL ? 0 : heap_mem->length(); + for (int i = 0; i < arr_len; i++) { + char* start = (char*)heap_mem->at(i).start(); + size_t size = heap_mem->at(i).byte_size(); + char* top = start + size; + tty->print_cr("%s%d space: " SIZE_FORMAT_W(9) " [ %4.1f%% of total] out of " SIZE_FORMAT_W(9) " bytes [100%% used] at " INTPTR_FORMAT, + name, i, size, size/double(total_size)*100.0, size, p2i(start)); + + } +} // Update a Java object to point its Klass* to the new location after // shared archive has been compacted. @@ -1584,7 +1586,7 @@ #if INCLUDE_CDS_JAVA_HEAP void VM_PopulateDumpSharedSpace::dump_java_heap_objects() { - if (!MetaspaceShared::allow_archive_heap_object()) { + if (!MetaspaceShared::is_heap_object_archiving_allowed()) { if (log_is_enabled(Info, cds)) { log_info(cds)( "Archived java heap is not supported as UseG1GC, " @@ -1596,12 +1598,14 @@ return; } + NoSafepointVerifier nsv; + // Cache for recording where the archived objects are copied to MetaspaceShared::create_archive_object_cache(); tty->print_cr("Dumping String objects to closed archive heap region ..."); NOT_PRODUCT(StringTable::verify()); - // The string space has maximum two regions. See FileMapInfo::write_string_regions() for details. + // The string space has maximum two regions. See FileMapInfo::write_archive_heap_regions() for details. _string_regions = new GrowableArray(2); StringTable::write_to_archive(_string_regions); @@ -1629,8 +1633,6 @@ oop MetaspaceShared::archive_heap_object(oop obj, Thread* THREAD) { assert(DumpSharedSpaces, "dump-time only"); - NoSafepointVerifier nsv; - ArchivedObjectCache* cache = MetaspaceShared::archive_object_cache(); oop* p = cache->get(obj); if (p != NULL) {