mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-22 03:54:33 +02:00
8024927: Nashorn performance regression with CompressedOops
Allocate compressed class space at end of Java heap. For small heap sizes, without CDS, save some space so compressed classes can have the same favorable compression as oops Reviewed-by: stefank, hseigel, goetz
This commit is contained in:
parent
4e192289d4
commit
3e6630c07b
8 changed files with 295 additions and 95 deletions
|
@ -56,7 +56,7 @@ size_t const allocation_from_dictionary_limit = 4 * K;
|
|||
|
||||
MetaWord* last_allocated = 0;
|
||||
|
||||
size_t Metaspace::_class_metaspace_size;
|
||||
size_t Metaspace::_compressed_class_space_size;
|
||||
|
||||
// Used in declarations in SpaceManager and ChunkManager
|
||||
enum ChunkIndex {
|
||||
|
@ -2799,6 +2799,8 @@ ChunkManager* Metaspace::_chunk_manager_class = NULL;
|
|||
#define VIRTUALSPACEMULTIPLIER 2
|
||||
|
||||
#ifdef _LP64
|
||||
static const uint64_t UnscaledClassSpaceMax = (uint64_t(max_juint) + 1);
|
||||
|
||||
void Metaspace::set_narrow_klass_base_and_shift(address metaspace_base, address cds_base) {
|
||||
// Figure out the narrow_klass_base and the narrow_klass_shift. The
|
||||
// narrow_klass_base is the lower of the metaspace base and the cds base
|
||||
|
@ -2808,14 +2810,22 @@ void Metaspace::set_narrow_klass_base_and_shift(address metaspace_base, address
|
|||
address higher_address;
|
||||
if (UseSharedSpaces) {
|
||||
higher_address = MAX2((address)(cds_base + FileMapInfo::shared_spaces_size()),
|
||||
(address)(metaspace_base + class_metaspace_size()));
|
||||
(address)(metaspace_base + compressed_class_space_size()));
|
||||
lower_base = MIN2(metaspace_base, cds_base);
|
||||
} else {
|
||||
higher_address = metaspace_base + class_metaspace_size();
|
||||
higher_address = metaspace_base + compressed_class_space_size();
|
||||
lower_base = metaspace_base;
|
||||
|
||||
uint64_t klass_encoding_max = UnscaledClassSpaceMax << LogKlassAlignmentInBytes;
|
||||
// If compressed class space fits in lower 32G, we don't need a base.
|
||||
if (higher_address <= (address)klass_encoding_max) {
|
||||
lower_base = 0; // effectively lower base is zero.
|
||||
}
|
||||
}
|
||||
|
||||
Universe::set_narrow_klass_base(lower_base);
|
||||
if ((uint64_t)(higher_address - lower_base) < (uint64_t)max_juint) {
|
||||
|
||||
if ((uint64_t)(higher_address - lower_base) < UnscaledClassSpaceMax) {
|
||||
Universe::set_narrow_klass_shift(0);
|
||||
} else {
|
||||
assert(!UseSharedSpaces, "Cannot shift with UseSharedSpaces");
|
||||
|
@ -2830,24 +2840,24 @@ bool Metaspace::can_use_cds_with_metaspace_addr(char* metaspace_base, address cd
|
|||
assert(UseCompressedClassPointers, "Only use with CompressedKlassPtrs");
|
||||
address lower_base = MIN2((address)metaspace_base, cds_base);
|
||||
address higher_address = MAX2((address)(cds_base + FileMapInfo::shared_spaces_size()),
|
||||
(address)(metaspace_base + class_metaspace_size()));
|
||||
return ((uint64_t)(higher_address - lower_base) < (uint64_t)max_juint);
|
||||
(address)(metaspace_base + compressed_class_space_size()));
|
||||
return ((uint64_t)(higher_address - lower_base) < UnscaledClassSpaceMax);
|
||||
}
|
||||
|
||||
// Try to allocate the metaspace at the requested addr.
|
||||
void Metaspace::allocate_metaspace_compressed_klass_ptrs(char* requested_addr, address cds_base) {
|
||||
assert(using_class_space(), "called improperly");
|
||||
assert(UseCompressedClassPointers, "Only use with CompressedKlassPtrs");
|
||||
assert(class_metaspace_size() < KlassEncodingMetaspaceMax,
|
||||
assert(compressed_class_space_size() < KlassEncodingMetaspaceMax,
|
||||
"Metaspace size is too big");
|
||||
assert_is_ptr_aligned(requested_addr, _reserve_alignment);
|
||||
assert_is_ptr_aligned(cds_base, _reserve_alignment);
|
||||
assert_is_size_aligned(class_metaspace_size(), _reserve_alignment);
|
||||
assert_is_ptr_aligned(requested_addr, _reserve_alignment);
|
||||
assert_is_ptr_aligned(cds_base, _reserve_alignment);
|
||||
assert_is_size_aligned(compressed_class_space_size(), _reserve_alignment);
|
||||
|
||||
// Don't use large pages for the class space.
|
||||
bool large_pages = false;
|
||||
|
||||
ReservedSpace metaspace_rs = ReservedSpace(class_metaspace_size(),
|
||||
ReservedSpace metaspace_rs = ReservedSpace(compressed_class_space_size(),
|
||||
_reserve_alignment,
|
||||
large_pages,
|
||||
requested_addr, 0);
|
||||
|
@ -2862,7 +2872,7 @@ void Metaspace::allocate_metaspace_compressed_klass_ptrs(char* requested_addr, a
|
|||
while (!metaspace_rs.is_reserved() && (addr + increment > addr) &&
|
||||
can_use_cds_with_metaspace_addr(addr + increment, cds_base)) {
|
||||
addr = addr + increment;
|
||||
metaspace_rs = ReservedSpace(class_metaspace_size(),
|
||||
metaspace_rs = ReservedSpace(compressed_class_space_size(),
|
||||
_reserve_alignment, large_pages, addr, 0);
|
||||
}
|
||||
}
|
||||
|
@ -2873,11 +2883,11 @@ void Metaspace::allocate_metaspace_compressed_klass_ptrs(char* requested_addr, a
|
|||
// initialization has happened that depends on UseCompressedClassPointers.
|
||||
// So, UseCompressedClassPointers cannot be turned off at this point.
|
||||
if (!metaspace_rs.is_reserved()) {
|
||||
metaspace_rs = ReservedSpace(class_metaspace_size(),
|
||||
metaspace_rs = ReservedSpace(compressed_class_space_size(),
|
||||
_reserve_alignment, large_pages);
|
||||
if (!metaspace_rs.is_reserved()) {
|
||||
vm_exit_during_initialization(err_msg("Could not allocate metaspace: %d bytes",
|
||||
class_metaspace_size()));
|
||||
compressed_class_space_size()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2899,8 +2909,8 @@ void Metaspace::allocate_metaspace_compressed_klass_ptrs(char* requested_addr, a
|
|||
if (PrintCompressedOopsMode || (PrintMiscellaneous && Verbose)) {
|
||||
gclog_or_tty->print_cr("Narrow klass base: " PTR_FORMAT ", Narrow klass shift: " SIZE_FORMAT,
|
||||
Universe::narrow_klass_base(), Universe::narrow_klass_shift());
|
||||
gclog_or_tty->print_cr("Metaspace Size: " SIZE_FORMAT " Address: " PTR_FORMAT " Req Addr: " PTR_FORMAT,
|
||||
class_metaspace_size(), metaspace_rs.base(), requested_addr);
|
||||
gclog_or_tty->print_cr("Compressed class space size: " SIZE_FORMAT " Address: " PTR_FORMAT " Req Addr: " PTR_FORMAT,
|
||||
compressed_class_space_size(), metaspace_rs.base(), requested_addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2966,7 +2976,7 @@ void Metaspace::ergo_initialize() {
|
|||
MaxMetaspaceExpansion = restricted_align_down(MaxMetaspaceExpansion, _commit_alignment);
|
||||
|
||||
CompressedClassSpaceSize = restricted_align_down(CompressedClassSpaceSize, _reserve_alignment);
|
||||
set_class_metaspace_size(CompressedClassSpaceSize);
|
||||
set_compressed_class_space_size(CompressedClassSpaceSize);
|
||||
}
|
||||
|
||||
void Metaspace::global_initialize() {
|
||||
|
@ -2995,12 +3005,12 @@ void Metaspace::global_initialize() {
|
|||
}
|
||||
|
||||
#ifdef _LP64
|
||||
if (cds_total + class_metaspace_size() > (uint64_t)max_juint) {
|
||||
if (cds_total + compressed_class_space_size() > UnscaledClassSpaceMax) {
|
||||
vm_exit_during_initialization("Unable to dump shared archive.",
|
||||
err_msg("Size of archive (" SIZE_FORMAT ") + compressed class space ("
|
||||
SIZE_FORMAT ") == total (" SIZE_FORMAT ") is larger than compressed "
|
||||
"klass limit: " SIZE_FORMAT, cds_total, class_metaspace_size(),
|
||||
cds_total + class_metaspace_size(), (size_t)max_juint));
|
||||
"klass limit: " SIZE_FORMAT, cds_total, compressed_class_space_size(),
|
||||
cds_total + compressed_class_space_size(), UnscaledClassSpaceMax));
|
||||
}
|
||||
|
||||
// Set the compressed klass pointer base so that decoding of these pointers works
|
||||
|
@ -3048,7 +3058,8 @@ void Metaspace::global_initialize() {
|
|||
cds_end = (char *)align_ptr_up(cds_end, _reserve_alignment);
|
||||
allocate_metaspace_compressed_klass_ptrs(cds_end, cds_address);
|
||||
} else {
|
||||
allocate_metaspace_compressed_klass_ptrs((char *)CompressedKlassPointersBase, 0);
|
||||
char* base = (char*)align_ptr_up(Universe::heap()->reserved_region().end(), _reserve_alignment);
|
||||
allocate_metaspace_compressed_klass_ptrs(base, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue