< prev index next >
src/hotspot/share/memory/filemap.cpp
Print this page
*** 852,862 ****
address FileMapInfo::decode_start_address(CDSFileMapRegion* spc, bool with_current_oop_encoding_mode) {
if (with_current_oop_encoding_mode) {
return (address)CompressedOops::decode_not_null(offset_of_space(spc));
} else {
! return (address)HeapShared::decode_with_archived_oop_encoding_mode(offset_of_space(spc));
}
}
static MemRegion *string_ranges = NULL;
static MemRegion *open_archive_heap_ranges = NULL;
--- 852,862 ----
address FileMapInfo::decode_start_address(CDSFileMapRegion* spc, bool with_current_oop_encoding_mode) {
if (with_current_oop_encoding_mode) {
return (address)CompressedOops::decode_not_null(offset_of_space(spc));
} else {
! return (address)HeapShared::decode_from_archive(offset_of_space(spc));
}
}
static MemRegion *string_ranges = NULL;
static MemRegion *open_archive_heap_ranges = NULL;
*** 878,888 ****
for (int i = MetaspaceShared::first_string; i <= MetaspaceShared::last_valid_region; i++) {
CDSFileMapRegion* si = space_at(i);
size_t size = si->_used;
if (size > 0) {
! address s = start_address_with_current_oop_encoding_mode(si);
address e = s + size;
if (start > s) {
start = s;
}
if (end < e) {
--- 878,888 ----
for (int i = MetaspaceShared::first_string; i <= MetaspaceShared::last_valid_region; i++) {
CDSFileMapRegion* si = space_at(i);
size_t size = si->_used;
if (size > 0) {
! address s = start_address_as_decoded_with_current_oop_encoding_mode(si);
address e = s + size;
if (start > s) {
start = s;
}
if (end < e) {
*** 970,994 ****
log_info(cds)("CDS heap data relocation delta = " INTX_FORMAT " bytes", delta);
HeapShared::init_narrow_oop_decoding(narrow_oop_base() + delta, narrow_oop_shift());
CDSFileMapRegion* si = space_at(MetaspaceShared::first_string);
! address relocated_strings_bottom = start_address_with_archived_oop_encoding_mode(si);
! if (!is_aligned(relocated_strings_bottom + delta, HeapRegion::GrainBytes)) {
// Align the bottom of the string regions at G1 region boundary. This will avoid
// the situation where the highest open region and the lowest string region sharing
// the same G1 region. Otherwise we will fail to map the open regions.
size_t align = size_t(relocated_strings_bottom) % HeapRegion::GrainBytes;
delta -= align;
- assert(is_aligned(relocated_strings_bottom + delta, HeapRegion::GrainBytes), "must be");
-
log_info(cds)("CDS heap data need to be relocated lower by a further " SIZE_FORMAT
! " bytes to be aligned with HeapRegion::GrainBytes", align);
!
HeapShared::init_narrow_oop_decoding(narrow_oop_base() + delta, narrow_oop_shift());
_heap_pointers_need_patching = true;
}
// First, map string regions as closed archive heap regions.
// GC does not write into the regions.
if (map_heap_data(&string_ranges,
MetaspaceShared::first_string,
--- 970,993 ----
log_info(cds)("CDS heap data relocation delta = " INTX_FORMAT " bytes", delta);
HeapShared::init_narrow_oop_decoding(narrow_oop_base() + delta, narrow_oop_shift());
CDSFileMapRegion* si = space_at(MetaspaceShared::first_string);
! address relocated_strings_bottom = start_address_as_decoded_from_archive(si);
! if (!is_aligned(relocated_strings_bottom, HeapRegion::GrainBytes)) {
// Align the bottom of the string regions at G1 region boundary. This will avoid
// the situation where the highest open region and the lowest string region sharing
// the same G1 region. Otherwise we will fail to map the open regions.
size_t align = size_t(relocated_strings_bottom) % HeapRegion::GrainBytes;
delta -= align;
log_info(cds)("CDS heap data need to be relocated lower by a further " SIZE_FORMAT
! " bytes to " INTX_FORMAT " to be aligned with HeapRegion::GrainBytes", align, delta);
HeapShared::init_narrow_oop_decoding(narrow_oop_base() + delta, narrow_oop_shift());
_heap_pointers_need_patching = true;
+ relocated_strings_bottom = start_address_as_decoded_from_archive(si);
}
+ assert(is_aligned(relocated_strings_bottom, HeapRegion::GrainBytes), "must be");
// First, map string regions as closed archive heap regions.
// GC does not write into the regions.
if (map_heap_data(&string_ranges,
MetaspaceShared::first_string,
*** 1030,1040 ****
for (int i = first;
i < first + max; i++) {
si = space_at(i);
size_t size = si->_used;
if (size > 0) {
! HeapWord* start = (HeapWord*)start_address_with_archived_oop_encoding_mode(si);
regions[region_num] = MemRegion(start, size / HeapWordSize);
region_num ++;
log_info(cds)("Trying to map heap data: region[%d] at " INTPTR_FORMAT ", size = " SIZE_FORMAT_W(8) " bytes",
i, p2i(start), size);
}
--- 1029,1039 ----
for (int i = first;
i < first + max; i++) {
si = space_at(i);
size_t size = si->_used;
if (size > 0) {
! HeapWord* start = (HeapWord*)start_address_as_decoded_from_archive(si);
regions[region_num] = MemRegion(start, size / HeapWordSize);
region_num ++;
log_info(cds)("Trying to map heap data: region[%d] at " INTPTR_FORMAT ", size = " SIZE_FORMAT_W(8) " bytes",
i, p2i(start), size);
}
*** 1240,1250 ****
char* FileMapInfo::region_addr(int idx) {
CDSFileMapRegion* si = space_at(idx);
if (MetaspaceShared::is_heap_region(idx)) {
assert(DumpSharedSpaces, "The following doesn't work at runtime");
return si->_used > 0 ?
! (char*)start_address_with_current_oop_encoding_mode(si) : NULL;
} else {
return si->_addr._base;
}
}
--- 1239,1249 ----
char* FileMapInfo::region_addr(int idx) {
CDSFileMapRegion* si = space_at(idx);
if (MetaspaceShared::is_heap_region(idx)) {
assert(DumpSharedSpaces, "The following doesn't work at runtime");
return si->_used > 0 ?
! (char*)start_address_as_decoded_with_current_oop_encoding_mode(si) : NULL;
} else {
return si->_addr._base;
}
}
< prev index next >