@@ -69,32 +69,49 @@ last gc time
69
69
object iterator??!!
70
70
*/
71
71
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
+ };
74
92
75
93
MMTkHeap* MMTkHeap::_heap = NULL ;
76
94
77
95
MMTkHeap::MMTkHeap () :
78
96
CollectedHeap(),
97
+ _mmtk_pool(nullptr ),
98
+ _mmtk_manager(nullptr ),
79
99
_n_workers(0 ),
80
100
_gc_lock(new Monitor(Mutex::nosafepoint, " MMTkHeap::_gc_lock" , true )),
81
101
_num_root_scan_tasks(0 ),
102
+ _companion_thread(nullptr ),
82
103
_soft_ref_policy(),
83
104
_last_gc_time(0 )
84
- // , _par_state_string(StringTable::weak_storage())
85
105
{
86
106
_heap = this ;
87
107
}
88
108
89
109
jint MMTkHeap::initialize () {
90
110
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
+
93
113
const size_t min_heap_size = MinHeapSize;
94
114
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());
98
115
99
116
if (UseCompressedOops) mmtk_enable_compressed_oops ();
100
117
@@ -125,35 +142,27 @@ jint MMTkHeap::initialize() {
125
142
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);
126
143
127
144
openjdk_gc_init (&mmtk_upcalls);
145
+
128
146
// 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.
129
147
MMTkMutatorContext::max_non_los_default_alloc_bytes = get_max_non_los_default_alloc_bytes ();
130
148
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
134
154
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);
147
155
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);
153
157
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
+ }
154
164
155
- MMTkBarrierSet* const barrier_set = new MMTkBarrierSet (heap_rs.region ());
156
- // barrier_set->initialize();
165
+ MMTkBarrierSet* const barrier_set = new MMTkBarrierSet (_reserved);
157
166
BarrierSet::set_barrier_set (barrier_set);
158
167
159
168
_companion_thread = new MMTkVMCompanionThread ();
@@ -380,9 +389,7 @@ void MMTkHeap::prepare_for_verify() {
380
389
381
390
382
391
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 );
386
393
387
394
_mmtk_manager = new GCMemoryManager (" MMTk GC" );
388
395
_mmtk_manager->add_pool (_mmtk_pool);
0 commit comments