From b5d5240a996b987e1c4617deb01e496d8935f76a Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Wed, 11 Sep 2024 16:56:52 +0200 Subject: [PATCH 1/2] Fix --- src/hotspot/share/cds/archiveHeapWriter.cpp | 12 ++--- src/hotspot/share/cds/filemap.cpp | 50 ++++++++++++--------- src/hotspot/share/cds/filemap.hpp | 2 +- 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/hotspot/share/cds/archiveHeapWriter.cpp b/src/hotspot/share/cds/archiveHeapWriter.cpp index d8ee7155452ff..68e37d0504b1c 100644 --- a/src/hotspot/share/cds/archiveHeapWriter.cpp +++ b/src/hotspot/share/cds/archiveHeapWriter.cpp @@ -249,11 +249,16 @@ void ArchiveHeapWriter::copy_roots_to_buffer(GrowableArrayCHeap_rank; int rank_b = b->_rank; diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index b86118c686886..9db09196936c9 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -1581,39 +1581,47 @@ static size_t write_bitmap(const CHeapBitMap* map, char* output, size_t offset) return offset + size_in_bytes; } -// The start of the archived heap has many primitive arrays (String -// bodies) that are not marked by the oop/ptr maps. So we must have -// lots of leading zeros. -size_t FileMapInfo::remove_bitmap_leading_zeros(CHeapBitMap* map) { - size_t old_zeros = map->find_first_set_bit(0); +// The sorting code groups the objects with non-null oop/ptrs together. +// Relevant bitmaps then have lots of leading and trailing zeros, which +// we do not have to store. +size_t FileMapInfo::remove_bitmap_zeros(CHeapBitMap* map) { + BitMap::idx_t first_set = map->find_first_set_bit(0); + BitMap::idx_t last_set = map->find_last_set_bit(0); size_t old_size = map->size(); // Slice and resize bitmap - map->truncate(old_zeros, map->size()); + map->truncate(first_set, last_set + 1); - DEBUG_ONLY( - size_t new_zeros = map->find_first_set_bit(0); - assert(new_zeros == 0, "Should have removed leading zeros"); - ) + log_info(cds, map)("Truncated bitmap " PTR_FORMAT " " SIZE_FORMAT " -> " SIZE_FORMAT, + p2i(map), old_size, last_set - first_set); + + LogTarget(Info, cds, map) lt; + if (lt.is_enabled()) { + LogStream ls(lt); + map->print_on(&ls); + } + + assert(map->at(0), "First bit should be set"); + assert(map->at(map->size() - 1), "Last bit should be set"); assert(map->size() <= old_size, "sanity"); - return old_zeros; + + return first_set; } char* FileMapInfo::write_bitmap_region(CHeapBitMap* rw_ptrmap, CHeapBitMap* ro_ptrmap, ArchiveHeapInfo* heap_info, size_t &size_in_bytes) { - size_t removed_rw_zeros = remove_bitmap_leading_zeros(rw_ptrmap); - size_t removed_ro_zeros = remove_bitmap_leading_zeros(ro_ptrmap); - header()->set_rw_ptrmap_start_pos(removed_rw_zeros); - header()->set_ro_ptrmap_start_pos(removed_ro_zeros); + size_t removed_rw_leading_zeros = remove_bitmap_zeros(rw_ptrmap); + size_t removed_ro_leading_zeros = remove_bitmap_zeros(ro_ptrmap); + header()->set_rw_ptrmap_start_pos(removed_rw_leading_zeros); + header()->set_ro_ptrmap_start_pos(removed_ro_leading_zeros); size_in_bytes = rw_ptrmap->size_in_bytes() + ro_ptrmap->size_in_bytes(); if (heap_info->is_used()) { - // Remove leading zeros - size_t removed_oop_zeros = remove_bitmap_leading_zeros(heap_info->oopmap()); - size_t removed_ptr_zeros = remove_bitmap_leading_zeros(heap_info->ptrmap()); - - header()->set_heap_oopmap_start_pos(removed_oop_zeros); - header()->set_heap_ptrmap_start_pos(removed_ptr_zeros); + // Remove leading and trailing zeros + size_t removed_oop_leading_zeros = remove_bitmap_zeros(heap_info->oopmap()); + size_t removed_ptr_leading_zeros = remove_bitmap_zeros(heap_info->ptrmap()); + header()->set_heap_oopmap_start_pos(removed_oop_leading_zeros); + header()->set_heap_ptrmap_start_pos(removed_ptr_leading_zeros); size_in_bytes += heap_info->oopmap()->size_in_bytes(); size_in_bytes += heap_info->ptrmap()->size_in_bytes(); diff --git a/src/hotspot/share/cds/filemap.hpp b/src/hotspot/share/cds/filemap.hpp index aa728b9d4949f..1bf2510a3351c 100644 --- a/src/hotspot/share/cds/filemap.hpp +++ b/src/hotspot/share/cds/filemap.hpp @@ -445,7 +445,7 @@ class FileMapInfo : public CHeapObj { void write_header(); void write_region(int region, char* base, size_t size, bool read_only, bool allow_exec); - size_t remove_bitmap_leading_zeros(CHeapBitMap* map); + size_t remove_bitmap_zeros(CHeapBitMap* map); char* write_bitmap_region(CHeapBitMap* rw_ptrmap, CHeapBitMap* ro_ptrmap, ArchiveHeapInfo* heap_info, size_t &size_in_bytes); size_t write_heap_region(ArchiveHeapInfo* heap_info); From 8a45759ff5c1401eb1be847ad7c9af93c212f424 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Mon, 16 Sep 2024 10:49:03 +0200 Subject: [PATCH 2/2] Remove excessive debugging logging --- src/hotspot/share/cds/filemap.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index 9db09196936c9..19733a11eb8ca 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -1592,15 +1592,6 @@ size_t FileMapInfo::remove_bitmap_zeros(CHeapBitMap* map) { // Slice and resize bitmap map->truncate(first_set, last_set + 1); - log_info(cds, map)("Truncated bitmap " PTR_FORMAT " " SIZE_FORMAT " -> " SIZE_FORMAT, - p2i(map), old_size, last_set - first_set); - - LogTarget(Info, cds, map) lt; - if (lt.is_enabled()) { - LogStream ls(lt); - map->print_on(&ls); - } - assert(map->at(0), "First bit should be set"); assert(map->at(map->size() - 1), "Last bit should be set"); assert(map->size() <= old_size, "sanity");