@@ -1581,39 +1581,38 @@ static size_t write_bitmap(const CHeapBitMap* map, char* output, size_t offset)
15811581 return offset + size_in_bytes;
15821582}
15831583
1584- // The start of the archived heap has many primitive arrays (String
1585- // bodies) that are not marked by the oop/ptr maps. So we must have
1586- // lots of leading zeros.
1587- size_t FileMapInfo::remove_bitmap_leading_zeros (CHeapBitMap* map) {
1588- size_t old_zeros = map->find_first_set_bit (0 );
1584+ // The sorting code groups the objects with non-null oop/ptrs together.
1585+ // Relevant bitmaps then have lots of leading and trailing zeros, which
1586+ // we do not have to store.
1587+ size_t FileMapInfo::remove_bitmap_zeros (CHeapBitMap* map) {
1588+ BitMap::idx_t first_set = map->find_first_set_bit (0 );
1589+ BitMap::idx_t last_set = map->find_last_set_bit (0 );
15891590 size_t old_size = map->size ();
15901591
15911592 // Slice and resize bitmap
1592- map->truncate (old_zeros, map-> size () );
1593+ map->truncate (first_set, last_set + 1 );
15931594
1594- DEBUG_ONLY (
1595- size_t new_zeros = map->find_first_set_bit (0 );
1596- assert (new_zeros == 0 , " Should have removed leading zeros" );
1597- )
1595+ assert (map->at (0 ), " First bit should be set" );
1596+ assert (map->at (map->size () - 1 ), " Last bit should be set" );
15981597 assert (map->size () <= old_size, " sanity" );
1599- return old_zeros;
1598+
1599+ return first_set;
16001600}
16011601
16021602char * FileMapInfo::write_bitmap_region (CHeapBitMap* rw_ptrmap, CHeapBitMap* ro_ptrmap, ArchiveHeapInfo* heap_info,
16031603 size_t &size_in_bytes) {
1604- size_t removed_rw_zeros = remove_bitmap_leading_zeros (rw_ptrmap);
1605- size_t removed_ro_zeros = remove_bitmap_leading_zeros (ro_ptrmap);
1606- header ()->set_rw_ptrmap_start_pos (removed_rw_zeros );
1607- header ()->set_ro_ptrmap_start_pos (removed_ro_zeros );
1604+ size_t removed_rw_leading_zeros = remove_bitmap_zeros (rw_ptrmap);
1605+ size_t removed_ro_leading_zeros = remove_bitmap_zeros (ro_ptrmap);
1606+ header ()->set_rw_ptrmap_start_pos (removed_rw_leading_zeros );
1607+ header ()->set_ro_ptrmap_start_pos (removed_ro_leading_zeros );
16081608 size_in_bytes = rw_ptrmap->size_in_bytes () + ro_ptrmap->size_in_bytes ();
16091609
16101610 if (heap_info->is_used ()) {
1611- // Remove leading zeros
1612- size_t removed_oop_zeros = remove_bitmap_leading_zeros (heap_info->oopmap ());
1613- size_t removed_ptr_zeros = remove_bitmap_leading_zeros (heap_info->ptrmap ());
1614-
1615- header ()->set_heap_oopmap_start_pos (removed_oop_zeros);
1616- header ()->set_heap_ptrmap_start_pos (removed_ptr_zeros);
1611+ // Remove leading and trailing zeros
1612+ size_t removed_oop_leading_zeros = remove_bitmap_zeros (heap_info->oopmap ());
1613+ size_t removed_ptr_leading_zeros = remove_bitmap_zeros (heap_info->ptrmap ());
1614+ header ()->set_heap_oopmap_start_pos (removed_oop_leading_zeros);
1615+ header ()->set_heap_ptrmap_start_pos (removed_ptr_leading_zeros);
16171616
16181617 size_in_bytes += heap_info->oopmap ()->size_in_bytes ();
16191618 size_in_bytes += heap_info->ptrmap ()->size_in_bytes ();
0 commit comments