Skip to content

Commit

Permalink
Fix
Browse files Browse the repository at this point in the history
  • Loading branch information
shipilev committed Sep 16, 2024
1 parent 4b79063 commit b5d5240
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 28 deletions.
12 changes: 6 additions & 6 deletions src/hotspot/share/cds/archiveHeapWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,11 +249,16 @@ void ArchiveHeapWriter::copy_roots_to_buffer(GrowableArrayCHeap<oop, mtClassShar
_heap_root_segments = segments;
}

// The goal is to sort the objects in increasing order of:
// - objects that have only oop pointers
// - objects that have both native and oop pointers
// - objects that have only native pointers
// - objects that have no pointers
static int oop_sorting_rank(oop o) {
bool has_oop_ptr, has_native_ptr;
HeapShared::get_pointer_info(o, has_oop_ptr, has_native_ptr);

if (!has_oop_ptr) {
if (has_oop_ptr) {
if (!has_native_ptr) {
return 0;
} else {
Expand All @@ -268,11 +273,6 @@ static int oop_sorting_rank(oop o) {
}
}

// The goal is to sort the objects in increasing order of:
// - objects that have no pointers
// - objects that have only native pointers
// - objects that have both native and oop pointers
// - objects that have only oop pointers
int ArchiveHeapWriter::compare_objs_by_oop_fields(HeapObjOrder* a, HeapObjOrder* b) {
int rank_a = a->_rank;
int rank_b = b->_rank;
Expand Down
50 changes: 29 additions & 21 deletions src/hotspot/share/cds/filemap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/cds/filemap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ class FileMapInfo : public CHeapObj<mtInternal> {
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);
Expand Down

0 comments on commit b5d5240

Please sign in to comment.