Skip to content

Commit 94d30a2

Browse files
committed
Support compressed oops
1 parent 2fcf270 commit 94d30a2

File tree

5 files changed

+58
-50
lines changed

5 files changed

+58
-50
lines changed

openjdk/share/mmtkBarrierSet.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "oops/access.hpp"
3434
#include "oops/arrayOop.hpp"
3535
#include "oops/accessBackend.hpp"
36+
#include "oops/compressedOops.hpp"
3637
#include "oops/oopsHierarchy.hpp"
3738
#include "utilities/fakeRttiSupport.hpp"
3839
#include "utilities/macros.hpp"

openjdk/share/mmtkHeap.cpp

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -69,32 +69,49 @@ last gc time
6969
object iterator??!!
7070
*/
7171

72-
//mmtkGCTaskManager* MMTkHeap::_mmtk_gc_task_manager = NULL;
73-
72+
// ReservedHeapSpace will actually do the mmap when constructed.
73+
// We reimplement it without mmaping, and fill in the fields manually using data from MMTk core.
74+
class MMTkReservedHeapSpace : public ReservedHeapSpace {
75+
public:
76+
MMTkReservedHeapSpace(bool use_compressed_oops)
77+
: ReservedHeapSpace(0, 0, 0) // When `size == 0`, the constructor of ReservedHeapSpace will return immediately.
78+
{
79+
uintptr_t start = (uintptr_t)starting_heap_address();
80+
uintptr_t end = (uintptr_t)last_heap_address();
81+
uintptr_t size = end - start;
82+
83+
_base = (char*)start;
84+
_size = size;
85+
_noaccess_prefix = 0;
86+
_alignment = HeapAlignment;
87+
_page_size = 4096; // MMTk has been assuming 4096-byte pages, which is not always true.
88+
_special = false; // from jfrVirtualMemory.cpp: "ReservedSpaces marked as special will have the entire memory pre-committed."
89+
_fd_for_heap = -1; // The MMTk heap is not backed by a file descriptor.
90+
}
91+
};
7492

7593
MMTkHeap* MMTkHeap::_heap = NULL;
7694

7795
MMTkHeap::MMTkHeap() :
7896
CollectedHeap(),
97+
_mmtk_pool(nullptr),
98+
_mmtk_manager(nullptr),
7999
_n_workers(0),
80100
_gc_lock(new Monitor(Mutex::nosafepoint, "MMTkHeap::_gc_lock", true)),
81101
_num_root_scan_tasks(0),
102+
_companion_thread(nullptr),
82103
_soft_ref_policy(),
83104
_last_gc_time(0)
84-
// , _par_state_string(StringTable::weak_storage())
85105
{
86106
_heap = this;
87107
}
88108

89109
jint MMTkHeap::initialize() {
90110
assert(!UseTLAB , "should disable UseTLAB");
91-
assert(!UseCompressedOops , "should disable CompressedOops");
92-
assert(!UseCompressedClassPointers , "should disable UseCompressedClassPointers");
111+
assert(AllocateHeapAt == nullptr, "MMTk does not support file-backed heap.");
112+
93113
const size_t min_heap_size = MinHeapSize;
94114
const size_t max_heap_size = MaxHeapSize;
95-
// const size_t min_heap_size = collector_policy()->min_heap_byte_size();
96-
// const size_t max_heap_size = collector_policy()->max_heap_byte_size();
97-
// printf("policy max heap size %zu, min heap size %zu\n", heap_size, collector_policy()->min_heap_byte_size());
98115

99116
if (UseCompressedOops) mmtk_enable_compressed_oops();
100117

@@ -125,35 +142,27 @@ jint MMTkHeap::initialize() {
125142
guarantee(set_heap_size, "Failed to set MMTk heap size. Please check if the heap size is valid: min = %ld, max = %ld\n", min_heap_size, max_heap_size);
126143

127144
openjdk_gc_init(&mmtk_upcalls);
145+
128146
// Cache the value here. It is a constant depending on the selected plan. The plan won't change from now, so value won't change.
129147
MMTkMutatorContext::max_non_los_default_alloc_bytes = get_max_non_los_default_alloc_bytes();
130148

131-
//ReservedSpace heap_rs = Universe::reserve_heap(mmtk_heap_size, _collector_policy->heap_alignment());
132-
133-
//printf("inside mmtkHeap.cpp.. reserved base %x size %u \n", heap_rs.base(), heap_rs.size());
149+
// Compute the memory range.
150+
// Other GC in OpenJDK will do mmap when constructing ReservedHeapSpace, but MMTk does mmap internally.
151+
// So we construct our special MMTkReservedHeapSpace which doesn't actually do mmap.
152+
MMTkReservedHeapSpace heap_rs(UseCompressedOops);
153+
initialize_reserved_region(heap_rs); // initializes this->_reserved
134154

135-
//os::trace_page_sizes("Heap",
136-
// _collector_policy->min_heap_byte_size(),
137-
// mmtk_heap_size,
138-
// collector_policy()->space_alignment(),
139-
// heap_rs.base(),
140-
// heap_rs.size());
141-
142-
//_start = (HeapWord*)heap_rs.base();
143-
//_end = (HeapWord*)(heap_rs.base() + heap_rs.size());
144-
145-
ReservedHeapSpace heap_rs = Universe::reserve_heap(MaxHeapSize, HeapAlignment);
146-
// printf("start: %p, end: %p\n", _start, _end);
147155
if (UseCompressedOops) {
148-
CompressedOops::set_base((address) mmtk_narrow_oop_base());
149-
CompressedOops::set_shift(mmtk_narrow_oop_shift());
150-
}
151-
152-
initialize_reserved_region(heap_rs);
156+
CompressedOops::initialize(heap_rs);
153157

158+
// Assert the base and the shift computed by MMTk and OpenJDK match.
159+
address mmtk_base = (address)mmtk_narrow_oop_base();
160+
int mmtk_shift = mmtk_narrow_oop_shift();
161+
guarantee(mmtk_base == CompressedOops::base(), "MMTk and OpenJDK disagree with narrow oop base. MMTk: %p, OpenJDK: %p", mmtk_base, CompressedOops::base());
162+
guarantee(mmtk_shift == CompressedOops::shift(), "MMTk and OpenJDK disagree with narrow oop shift. MMTk: %d, OpenJDK: %d", mmtk_shift, CompressedOops::shift());
163+
}
154164

155-
MMTkBarrierSet* const barrier_set = new MMTkBarrierSet(heap_rs.region());
156-
//barrier_set->initialize();
165+
MMTkBarrierSet* const barrier_set = new MMTkBarrierSet(_reserved);
157166
BarrierSet::set_barrier_set(barrier_set);
158167

159168
_companion_thread = new MMTkVMCompanionThread();
@@ -380,9 +389,7 @@ void MMTkHeap::prepare_for_verify() {
380389

381390

382391
void MMTkHeap::initialize_serviceability() {//OK
383-
384-
385-
_mmtk_pool = new MMTkMemoryPool(_start, _end, "MMTk pool", MinHeapSize, false);
392+
_mmtk_pool = new MMTkMemoryPool(_reserved, "MMTk pool", MinHeapSize, false);
386393

387394
_mmtk_manager = new GCMemoryManager("MMTk GC");
388395
_mmtk_manager->add_pool(_mmtk_pool);

openjdk/share/mmtkHeap.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,20 @@ class MMTkVMCompanionThread;
4848
class MMTkHeap : public CollectedHeap {
4949
MMTkMemoryPool* _mmtk_pool;
5050
GCMemoryManager* _mmtk_manager;
51-
HeapWord* _start;
52-
HeapWord* _end;
53-
static MMTkHeap* _heap;
5451
size_t _n_workers;
5552
Monitor* _gc_lock;
5653
ContiguousSpace* _space;
5754
int _num_root_scan_tasks;
5855
MMTkVMCompanionThread* _companion_thread;
5956
SoftRefPolicy _soft_ref_policy;
57+
6058
public:
59+
jlong _last_gc_time;
60+
61+
private:
62+
static MMTkHeap* _heap;
6163

64+
public:
6265
MMTkHeap();
6366

6467
void schedule_finalizer();
@@ -207,9 +210,6 @@ class MMTkHeap : public CollectedHeap {
207210
void scan_oop_storage_set_roots(OopClosure& cl);
208211
void scan_weak_processor_roots(OopClosure& cl);
209212
void scan_vm_thread_roots(OopClosure& cl);
210-
211-
jlong _last_gc_time;
212-
213213
};
214214

215215

openjdk/share/mmtkMemoryPool.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,20 @@
2525
#include "precompiled.hpp"
2626
#include "mmtkMemoryPool.hpp"
2727

28-
MMTkMemoryPool::MMTkMemoryPool(HeapWord* start, HeapWord* end,
29-
const char* name, size_t init_size,
28+
MMTkMemoryPool::MMTkMemoryPool(MemRegion region,
29+
const char* name,
30+
size_t init_size,
3031
bool support_usage_threshold) :
31-
CollectedMemoryPool(name, init_size,
32-
pointer_delta(start, end)*HeapWordSize, support_usage_threshold),
33-
34-
_start(start), _end(end), _used_in_bytes(0){
32+
CollectedMemoryPool(name, init_size, region.byte_size(), support_usage_threshold),
33+
_reserved(region),
34+
_used_in_bytes(0)
35+
{
3536
}
3637

3738
MemoryUsage MMTkMemoryPool::get_memory_usage() {
3839
size_t maxSize = (available_for_allocation() ? max_size() : 0);
3940
size_t used = used_in_bytes();
40-
size_t committed = pointer_delta(_start, _end)*HeapWordSize;
41+
size_t committed = _reserved.byte_size();
4142

4243
return MemoryUsage(initial_size(), used, committed, maxSize);
4344
}

openjdk/share/mmtkMemoryPool.hpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,15 @@
3030

3131
class MMTkMemoryPool : public CollectedMemoryPool {
3232
private:
33-
HeapWord* _start;
34-
HeapWord* _end;
33+
MemRegion _reserved;
3534
size_t _used_in_bytes;
3635

3736
public:
38-
MMTkMemoryPool(HeapWord* start, HeapWord* end, const char* name, size_t init_size, bool support_usage_threshold);
37+
MMTkMemoryPool(MemRegion region, const char* name, size_t init_size, bool support_usage_threshold);
3938

4039
MemoryUsage get_memory_usage();
4140
size_t used_in_bytes() { return _used_in_bytes; }
42-
size_t max_size() const { return pointer_delta(_start, _end)*HeapWordSize; }
41+
size_t max_size() const { return _reserved.byte_size(); }
4342
};
4443

4544

0 commit comments

Comments
 (0)