Skip to content

Commit 73b5dba

Browse files
committed
8345655: Move reservation code out of ReservedSpace
Reviewed-by: azafari, jsjolen
1 parent d50b725 commit 73b5dba

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1307
-931
lines changed

src/hotspot/share/cds/archiveBuilder.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include "logging/log.hpp"
4848
#include "logging/logStream.hpp"
4949
#include "memory/allStatic.hpp"
50+
#include "memory/memoryReserver.hpp"
5051
#include "memory/memRegion.hpp"
5152
#include "memory/resourceArea.hpp"
5253
#include "oops/compressedKlass.inline.hpp"
@@ -193,7 +194,7 @@ ArchiveBuilder::~ArchiveBuilder() {
193194
delete _klasses;
194195
delete _symbols;
195196
if (_shared_rs.is_reserved()) {
196-
_shared_rs.release();
197+
MemoryReserver::release(_shared_rs);
197198
}
198199
}
199200

@@ -347,7 +348,9 @@ size_t ArchiveBuilder::estimate_archive_size() {
347348

348349
address ArchiveBuilder::reserve_buffer() {
349350
size_t buffer_size = estimate_archive_size();
350-
ReservedSpace rs(buffer_size, MetaspaceShared::core_region_alignment(), os::vm_page_size());
351+
ReservedSpace rs = MemoryReserver::reserve(buffer_size,
352+
MetaspaceShared::core_region_alignment(),
353+
os::vm_page_size());
351354
if (!rs.is_reserved()) {
352355
log_error(cds)("Failed to reserve " SIZE_FORMAT " bytes of output buffer.", buffer_size);
353356
MetaspaceShared::unrecoverable_writing_error();

src/hotspot/share/cds/archiveBuilder.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
#include "cds/dumpAllocStats.hpp"
3030
#include "memory/metaspace.hpp"
3131
#include "memory/metaspaceClosure.hpp"
32+
#include "memory/reservedSpace.hpp"
33+
#include "memory/virtualspace.hpp"
3234
#include "oops/array.hpp"
3335
#include "oops/klass.hpp"
3436
#include "runtime/os.hpp"

src/hotspot/share/cds/dynamicArchive.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -29,7 +29,6 @@
2929
#include "classfile/compactHashtable.hpp"
3030
#include "memory/allStatic.hpp"
3131
#include "memory/memRegion.hpp"
32-
#include "memory/virtualspace.hpp"
3332
#include "oops/array.hpp"
3433
#include "oops/oop.hpp"
3534
#include "utilities/exceptions.hpp"

src/hotspot/share/cds/filemap.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class ClassFileStream;
4949
class ClassLoaderData;
5050
class ClassPathEntry;
5151
class outputStream;
52+
class ReservedSpace;
5253

5354
class SharedClassPathEntry : public MetaspaceObj {
5455
enum {
@@ -481,7 +482,6 @@ class FileMapInfo : public CHeapObj<mtInternal> {
481482
void unmap_region(int i);
482483
void close();
483484
bool is_open() { return _file_open; }
484-
ReservedSpace reserve_shared_memory();
485485

486486
// JVM/TI RedefineClasses() support:
487487
// Remap the shared readonly space to shared readwrite, private.

src/hotspot/share/cds/metaspaceShared.cpp

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
#include "logging/log.hpp"
6363
#include "logging/logMessage.hpp"
6464
#include "logging/logStream.hpp"
65+
#include "memory/memoryReserver.hpp"
6566
#include "memory/metaspace.hpp"
6667
#include "memory/metaspaceClosure.hpp"
6768
#include "memory/resourceArea.hpp"
@@ -282,7 +283,7 @@ void MetaspaceShared::initialize_for_static_dump() {
282283
SharedBaseAddress = (size_t)_requested_base_address;
283284

284285
size_t symbol_rs_size = LP64_ONLY(3 * G) NOT_LP64(128 * M);
285-
_symbol_rs = ReservedSpace(symbol_rs_size, mtClassShared);
286+
_symbol_rs = MemoryReserver::reserve(symbol_rs_size, mtClassShared);
286287
if (!_symbol_rs.is_reserved()) {
287288
log_error(cds)("Unable to reserve memory for symbols: " SIZE_FORMAT " bytes.", symbol_rs_size);
288289
MetaspaceShared::unrecoverable_writing_error();
@@ -1266,7 +1267,9 @@ MapArchiveResult MetaspaceShared::map_archives(FileMapInfo* static_mapinfo, File
12661267
if (use_requested_addr) {
12671268
assert(!total_space_rs.is_reserved(), "Should not be reserved for Windows");
12681269
log_info(cds)("Windows mmap workaround: releasing archive space.");
1269-
archive_space_rs.release();
1270+
MemoryReserver::release(archive_space_rs);
1271+
// Mark as not reserved
1272+
archive_space_rs = {};
12701273
}
12711274
}
12721275
MapArchiveResult static_result = map_archive(static_mapinfo, mapped_base_address, archive_space_rs);
@@ -1438,8 +1441,10 @@ char* MetaspaceShared::reserve_address_space_for_archives(FileMapInfo* static_ma
14381441
"Archive base address unaligned: " PTR_FORMAT ", needs alignment: %zu.",
14391442
p2i(base_address), archive_space_alignment);
14401443

1441-
archive_space_rs = ReservedSpace(archive_space_size, archive_space_alignment,
1442-
os::vm_page_size(), (char*)base_address);
1444+
archive_space_rs = MemoryReserver::reserve((char*)base_address,
1445+
archive_space_size,
1446+
archive_space_alignment,
1447+
os::vm_page_size());
14431448
if (archive_space_rs.is_reserved()) {
14441449
assert(base_address == nullptr ||
14451450
(address)archive_space_rs.base() == base_address, "Sanity");
@@ -1505,10 +1510,14 @@ char* MetaspaceShared::reserve_address_space_for_archives(FileMapInfo* static_ma
15051510
// caller will not split the combined space for mapping, instead read the archive data
15061511
// via sequential file IO.
15071512
address ccs_base = base_address + archive_space_size + gap_size;
1508-
archive_space_rs = ReservedSpace(archive_space_size, archive_space_alignment,
1509-
os::vm_page_size(), (char*)base_address);
1510-
class_space_rs = ReservedSpace(class_space_size, class_space_alignment,
1511-
os::vm_page_size(), (char*)ccs_base);
1513+
archive_space_rs = MemoryReserver::reserve((char*)base_address,
1514+
archive_space_size,
1515+
archive_space_alignment,
1516+
os::vm_page_size());
1517+
class_space_rs = MemoryReserver::reserve((char*)ccs_base,
1518+
class_space_size,
1519+
class_space_alignment,
1520+
os::vm_page_size());
15121521
}
15131522
if (!archive_space_rs.is_reserved() || !class_space_rs.is_reserved()) {
15141523
release_reserved_spaces(total_space_rs, archive_space_rs, class_space_rs);
@@ -1519,8 +1528,10 @@ char* MetaspaceShared::reserve_address_space_for_archives(FileMapInfo* static_ma
15191528
MemTracker::record_virtual_memory_tag(class_space_rs.base(), mtClass);
15201529
} else {
15211530
if (use_archive_base_addr && base_address != nullptr) {
1522-
total_space_rs = ReservedSpace(total_range_size, base_address_alignment,
1523-
os::vm_page_size(), (char*) base_address);
1531+
total_space_rs = MemoryReserver::reserve((char*) base_address,
1532+
total_range_size,
1533+
base_address_alignment,
1534+
os::vm_page_size());
15241535
} else {
15251536
// We did not manage to reserve at the preferred address, or were instructed to relocate. In that
15261537
// case we reserve wherever possible, but the start address needs to be encodable as narrow Klass
@@ -1568,15 +1579,18 @@ void MetaspaceShared::release_reserved_spaces(ReservedSpace& total_space_rs,
15681579
ReservedSpace& class_space_rs) {
15691580
if (total_space_rs.is_reserved()) {
15701581
log_debug(cds)("Released shared space (archive + class) " INTPTR_FORMAT, p2i(total_space_rs.base()));
1571-
total_space_rs.release();
1582+
MemoryReserver::release(total_space_rs);
1583+
total_space_rs = {};
15721584
} else {
15731585
if (archive_space_rs.is_reserved()) {
15741586
log_debug(cds)("Released shared space (archive) " INTPTR_FORMAT, p2i(archive_space_rs.base()));
1575-
archive_space_rs.release();
1587+
MemoryReserver::release(archive_space_rs);
1588+
archive_space_rs = {};
15761589
}
15771590
if (class_space_rs.is_reserved()) {
15781591
log_debug(cds)("Released shared space (classes) " INTPTR_FORMAT, p2i(class_space_rs.base()));
1579-
class_space_rs.release();
1592+
MemoryReserver::release(class_space_rs);
1593+
class_space_rs = {};
15801594
}
15811595
}
15821596
}

src/hotspot/share/cds/metaspaceShared.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
#include "memory/allocation.hpp"
2929
#include "memory/memRegion.hpp"
30+
#include "memory/reservedSpace.hpp"
3031
#include "memory/virtualspace.hpp"
3132
#include "oops/oop.hpp"
3233
#include "utilities/macros.hpp"

src/hotspot/share/code/codeCache.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "logging/logStream.hpp"
4545
#include "memory/allocation.inline.hpp"
4646
#include "memory/iterator.hpp"
47+
#include "memory/memoryReserver.hpp"
4748
#include "memory/resourceArea.hpp"
4849
#include "memory/universe.hpp"
4950
#include "oops/method.inline.hpp"
@@ -318,7 +319,7 @@ void CodeCache::initialize_heaps() {
318319
FLAG_SET_ERGO(NonProfiledCodeHeapSize, non_profiled.size);
319320
FLAG_SET_ERGO(ReservedCodeCacheSize, cache_size);
320321

321-
ReservedCodeSpace rs = reserve_heap_memory(cache_size, ps);
322+
ReservedSpace rs = reserve_heap_memory(cache_size, ps);
322323

323324
// Register CodeHeaps with LSan as we sometimes embed pointers to malloc memory.
324325
LSAN_REGISTER_ROOT_REGION(rs.base(), rs.size());
@@ -348,11 +349,12 @@ size_t CodeCache::page_size(bool aligned, size_t min_pages) {
348349
os::page_size_for_region_unaligned(ReservedCodeCacheSize, min_pages);
349350
}
350351

351-
ReservedCodeSpace CodeCache::reserve_heap_memory(size_t size, size_t rs_ps) {
352+
ReservedSpace CodeCache::reserve_heap_memory(size_t size, size_t rs_ps) {
352353
// Align and reserve space for code cache
353354
const size_t rs_align = MAX2(rs_ps, os::vm_allocation_granularity());
354355
const size_t rs_size = align_up(size, rs_align);
355-
ReservedCodeSpace rs(rs_size, rs_align, rs_ps);
356+
357+
ReservedSpace rs = CodeMemoryReserver::reserve(rs_size, rs_align, rs_ps);
356358
if (!rs.is_reserved()) {
357359
vm_exit_during_initialization(err_msg("Could not reserve enough space for code cache (" SIZE_FORMAT "K)",
358360
rs_size/K));
@@ -1130,7 +1132,7 @@ void CodeCache::initialize() {
11301132
// If InitialCodeCacheSize is equal to ReservedCodeCacheSize, then it's more likely
11311133
// users want to use the largest available page.
11321134
const size_t min_pages = (InitialCodeCacheSize == ReservedCodeCacheSize) ? 1 : 8;
1133-
ReservedCodeSpace rs = reserve_heap_memory(ReservedCodeCacheSize, page_size(false, min_pages));
1135+
ReservedSpace rs = reserve_heap_memory(ReservedCodeCacheSize, page_size(false, min_pages));
11341136
// Register CodeHeaps with LSan as we sometimes embed pointers to malloc memory.
11351137
LSAN_REGISTER_ROOT_REGION(rs.base(), rs.size());
11361138
add_heap(rs, "CodeCache", CodeBlobType::All);

src/hotspot/share/code/codeCache.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class OopClosure;
7979
class ShenandoahParallelCodeHeapIterator;
8080
class NativePostCallNop;
8181
class DeoptimizationScope;
82+
class ReservedSpace;
8283

8384
#ifdef LINUX
8485
#define DEFAULT_PERFMAP_FILENAME "/tmp/perf-%p.map"
@@ -122,7 +123,7 @@ class CodeCache : AllStatic {
122123
static CodeHeap* get_code_heap(CodeBlobType code_blob_type); // Returns the CodeHeap for the given CodeBlobType
123124
// Returns the name of the VM option to set the size of the corresponding CodeHeap
124125
static const char* get_code_heap_flag_name(CodeBlobType code_blob_type);
125-
static ReservedCodeSpace reserve_heap_memory(size_t size, size_t rs_ps); // Reserves one continuous chunk of memory for the CodeHeaps
126+
static ReservedSpace reserve_heap_memory(size_t size, size_t rs_ps); // Reserves one continuous chunk of memory for the CodeHeaps
126127

127128
// Iteration
128129
static CodeBlob* first_blob(CodeHeap* heap); // Returns the first CodeBlob on the given CodeHeap

src/hotspot/share/gc/g1/g1CollectedHeap.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
#include "memory/allocation.hpp"
9999
#include "memory/heapInspection.hpp"
100100
#include "memory/iterator.hpp"
101+
#include "memory/memoryReserver.hpp"
101102
#include "memory/metaspaceUtils.hpp"
102103
#include "memory/resourceArea.hpp"
103104
#include "memory/universe.hpp"
@@ -1212,8 +1213,21 @@ G1RegionToSpaceMapper* G1CollectedHeap::create_aux_memory_mapper(const char* des
12121213
size_t size,
12131214
size_t translation_factor) {
12141215
size_t preferred_page_size = os::page_size_for_region_unaligned(size, 1);
1216+
1217+
// When a page size is given we don't want to mix large
1218+
// and normal pages. If the size is not a multiple of the
1219+
// page size it will be aligned up to achieve this.
1220+
size_t alignment = os::vm_allocation_granularity();
1221+
if (preferred_page_size != os::vm_page_size()) {
1222+
alignment = MAX2(preferred_page_size, alignment);
1223+
size = align_up(size, alignment);
1224+
}
1225+
12151226
// Allocate a new reserved space, preferring to use large pages.
1216-
ReservedSpace rs(size, preferred_page_size);
1227+
ReservedSpace rs = MemoryReserver::reserve(size,
1228+
alignment,
1229+
preferred_page_size);
1230+
12171231
size_t page_size = rs.page_size();
12181232
G1RegionToSpaceMapper* result =
12191233
G1RegionToSpaceMapper::create_mapper(rs,
@@ -1288,7 +1302,7 @@ jint G1CollectedHeap::initialize() {
12881302
initialize_reserved_region(heap_rs);
12891303

12901304
// Create the barrier set for the entire reserved region.
1291-
G1CardTable* ct = new G1CardTable(heap_rs.region());
1305+
G1CardTable* ct = new G1CardTable(_reserved);
12921306
G1BarrierSet* bs = new G1BarrierSet(ct);
12931307
bs->initialize();
12941308
assert(bs->is_a(BarrierSet::G1BarrierSet), "sanity");
@@ -1440,7 +1454,7 @@ jint G1CollectedHeap::initialize() {
14401454

14411455
G1InitLogger::print();
14421456

1443-
FullGCForwarding::initialize(heap_rs.region());
1457+
FullGCForwarding::initialize(_reserved);
14441458

14451459
return JNI_OK;
14461460
}

src/hotspot/share/gc/g1/g1ConcurrentMarkBitMap.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include "gc/g1/g1CollectedHeap.inline.hpp"
2727
#include "gc/g1/g1ConcurrentMarkBitMap.inline.hpp"
2828
#include "gc/g1/g1HeapRegion.hpp"
29-
#include "memory/virtualspace.hpp"
3029

3130
G1CMBitMap::G1CMBitMap() : MarkBitMap(), _listener() {
3231
_listener.set_bitmap(this);

0 commit comments

Comments
 (0)