Skip to content

Commit 09ca397

Browse files
committed
8305896O Alternative full GC forwarding
1 parent 86239af commit 09ca397

18 files changed

+248
-79
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
#include "gc/shared/classUnloadingContext.hpp"
7979
#include "gc/shared/concurrentGCBreakpoints.hpp"
8080
#include "gc/shared/gcBehaviours.hpp"
81+
#include "gc/shared/gcForwarding.hpp"
8182
#include "gc/shared/gcHeapSummary.hpp"
8283
#include "gc/shared/gcId.hpp"
8384
#include "gc/shared/gcTimer.hpp"
@@ -1434,6 +1435,8 @@ jint G1CollectedHeap::initialize() {
14341435

14351436
G1InitLogger::print();
14361437

1438+
GCForwarding::initialize(heap_rs.region());
1439+
14371440
return JNI_OK;
14381441
}
14391442

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "gc/g1/g1FullGCCompactionPoint.hpp"
3030
#include "gc/g1/g1FullGCCompactTask.hpp"
3131
#include "gc/g1/g1HeapRegion.inline.hpp"
32+
#include "gc/shared/gcForwarding.inline.hpp"
3233
#include "gc/shared/gcTraceTime.inline.hpp"
3334
#include "logging/log.hpp"
3435
#include "oops/oop.inline.hpp"
@@ -41,7 +42,7 @@ void G1FullGCCompactTask::G1CompactRegionClosure::clear_in_bitmap(oop obj) {
4142

4243
size_t G1FullGCCompactTask::G1CompactRegionClosure::apply(oop obj) {
4344
size_t size = obj->size();
44-
if (obj->is_forwarded()) {
45+
if (GCForwarding::is_forwarded(obj)) {
4546
G1FullGCCompactTask::copy_object_to_new_location(obj);
4647
}
4748

@@ -52,13 +53,13 @@ size_t G1FullGCCompactTask::G1CompactRegionClosure::apply(oop obj) {
5253
}
5354

5455
void G1FullGCCompactTask::copy_object_to_new_location(oop obj) {
55-
assert(obj->is_forwarded(), "Sanity!");
56-
assert(obj->forwardee() != obj, "Object must have a new location");
56+
assert(GCForwarding::is_forwarded(obj), "Sanity!");
57+
assert(GCForwarding::forwardee(obj) != obj, "Object must have a new location");
5758

5859
size_t size = obj->size();
5960
// Copy object and reinit its mark.
6061
HeapWord* obj_addr = cast_from_oop<HeapWord*>(obj);
61-
HeapWord* destination = cast_from_oop<HeapWord*>(obj->forwardee());
62+
HeapWord* destination = cast_from_oop<HeapWord*>(GCForwarding::forwardee(obj));
6263
Copy::aligned_conjoint_words(obj_addr, destination, size);
6364

6465
// There is no need to transform stack chunks - marking already did that.
@@ -121,7 +122,7 @@ void G1FullGCCompactTask::compact_humongous_obj(G1HeapRegion* src_hr) {
121122
size_t word_size = obj->size();
122123

123124
uint num_regions = (uint)G1CollectedHeap::humongous_obj_size_in_regions(word_size);
124-
HeapWord* destination = cast_from_oop<HeapWord*>(obj->forwardee());
125+
HeapWord* destination = cast_from_oop<HeapWord*>(GCForwarding::forwardee(obj));
125126

126127
assert(collector()->mark_bitmap()->is_marked(obj), "Should only compact marked objects");
127128
collector()->mark_bitmap()->clear(obj);

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "gc/g1/g1FullCollector.inline.hpp"
2727
#include "gc/g1/g1FullGCCompactionPoint.hpp"
2828
#include "gc/g1/g1HeapRegion.hpp"
29+
#include "gc/shared/gcForwarding.inline.hpp"
2930
#include "gc/shared/preservedMarks.inline.hpp"
3031
#include "oops/oop.inline.hpp"
3132
#include "utilities/debug.hpp"
@@ -106,10 +107,10 @@ void G1FullGCCompactionPoint::forward(oop object, size_t size) {
106107
if (!object->is_forwarded()) {
107108
preserved_stack()->push_if_necessary(object, object->mark());
108109
}
109-
object->forward_to(cast_to_oop(_compaction_top));
110-
assert(object->is_forwarded(), "must be forwarded");
110+
GCForwarding::forward_to(object, cast_to_oop(_compaction_top));
111+
assert(GCForwarding::is_forwarded(object), "must be forwarded");
111112
} else {
112-
assert(!object->is_forwarded(), "must not be forwarded");
113+
assert(!GCForwarding::is_forwarded(object), "must not be forwarded");
113114
}
114115

115116
// Update compaction values.
@@ -172,8 +173,8 @@ void G1FullGCCompactionPoint::forward_humongous(G1HeapRegion* hr) {
172173
preserved_stack()->push_if_necessary(obj, obj->mark());
173174

174175
G1HeapRegion* dest_hr = _compaction_regions->at(range_begin);
175-
obj->forward_to(cast_to_oop(dest_hr->bottom()));
176-
assert(obj->is_forwarded(), "Object must be forwarded!");
176+
GCForwarding::forward_to(obj, cast_to_oop(dest_hr->bottom()));
177+
assert(GCForwarding::is_forwarded(obj), "Object must be forwarded!");
177178

178179
// Add the humongous object regions to the compaction point.
179180
add_humongous(hr);

src/hotspot/share/gc/g1/g1FullGCOopClosures.inline.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "gc/g1/g1FullCollector.inline.hpp"
3333
#include "gc/g1/g1FullGCMarker.inline.hpp"
3434
#include "gc/g1/g1HeapRegionRemSet.inline.hpp"
35+
#include "gc/shared/gcForwarding.inline.hpp"
3536
#include "memory/iterator.inline.hpp"
3637
#include "memory/universe.hpp"
3738
#include "oops/access.inline.hpp"
@@ -65,8 +66,8 @@ template <class T> inline void G1AdjustClosure::adjust_pointer(T* p) {
6566
return;
6667
}
6768

68-
if (obj->is_forwarded()) {
69-
oop forwardee = obj->forwardee();
69+
if (GCForwarding::is_forwarded(obj)) {
70+
oop forwardee = GCForwarding::forwardee(obj);
7071
// Forwarded, just update.
7172
assert(G1CollectedHeap::heap()->is_in_reserved(forwardee), "should be in object space");
7273
RawAccess<IS_NOT_NULL>::oop_store(p, forwardee);

src/hotspot/share/gc/g1/g1FullGCPrepareTask.inline.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "gc/g1/g1FullGCCompactionPoint.hpp"
3333
#include "gc/g1/g1FullGCScope.hpp"
3434
#include "gc/g1/g1HeapRegion.inline.hpp"
35+
#include "gc/shared/gcForwarding.inline.hpp"
3536

3637
void G1DetermineCompactionQueueClosure::free_empty_humongous_region(G1HeapRegion* hr) {
3738
_g1h->free_humongous_region(hr, nullptr);
@@ -114,10 +115,10 @@ inline bool G1DetermineCompactionQueueClosure::do_heap_region(G1HeapRegion* hr)
114115
}
115116

116117
inline size_t G1SerialRePrepareClosure::apply(oop obj) {
117-
if (obj->is_forwarded()) {
118+
if (GCForwarding::is_forwarded(obj)) {
118119
// We skip objects compiled into the first region or
119120
// into regions not part of the serial compaction point.
120-
if (cast_from_oop<HeapWord*>(obj->forwardee()) < _dense_prefix_top) {
121+
if (cast_from_oop<HeapWord*>(GCForwarding::forwardee(obj)) < _dense_prefix_top) {
121122
return obj->size();
122123
}
123124
}

src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "gc/parallel/psPromotionManager.hpp"
3434
#include "gc/parallel/psScavenge.hpp"
3535
#include "gc/parallel/psVMOperations.hpp"
36+
#include "gc/shared/gcForwarding.inline.hpp"
3637
#include "gc/shared/gcHeapSummary.hpp"
3738
#include "gc/shared/gcLocker.inline.hpp"
3839
#include "gc/shared/gcWhen.hpp"
@@ -129,6 +130,8 @@ jint ParallelScavengeHeap::initialize() {
129130

130131
ParallelInitLogger::print();
131132

133+
GCForwarding::initialize(heap_rs.region());
134+
132135
return JNI_OK;
133136
}
134137

src/hotspot/share/gc/parallel/psParallelCompact.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "gc/parallel/psYoungGen.hpp"
4646
#include "gc/shared/classUnloadingContext.hpp"
4747
#include "gc/shared/gcCause.hpp"
48+
#include "gc/shared/gcForwarding.inline.hpp"
4849
#include "gc/shared/gcHeapSummary.hpp"
4950
#include "gc/shared/gcId.hpp"
5051
#include "gc/shared/gcLocker.hpp"
@@ -1592,7 +1593,7 @@ void PSParallelCompact::forward_to_new_addr() {
15921593
oop obj = cast_to_oop(cur_addr);
15931594
if (new_addr != cur_addr) {
15941595
cm->preserved_marks()->push_if_necessary(obj, obj->mark());
1595-
obj->forward_to(cast_to_oop(new_addr));
1596+
GCForwarding::forward_to(obj, cast_to_oop(new_addr));
15961597
}
15971598
size_t obj_size = obj->size();
15981599
live_words += obj_size;
@@ -1635,7 +1636,7 @@ void PSParallelCompact::verify_forward() {
16351636
}
16361637
oop obj = cast_to_oop(cur_addr);
16371638
if (cur_addr != bump_ptr) {
1638-
assert(obj->forwardee() == cast_to_oop(bump_ptr), "inv");
1639+
assert(GCForwarding::forwardee(obj) == cast_to_oop(bump_ptr), "inv");
16391640
}
16401641
bump_ptr += obj->size();
16411642
cur_addr += obj->size();
@@ -2398,8 +2399,8 @@ void MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) {
23982399
if (copy_destination() != source()) {
23992400
DEBUG_ONLY(PSParallelCompact::check_new_location(source(), destination());)
24002401
assert(source() != destination(), "inv");
2401-
assert(cast_to_oop(source())->is_forwarded(), "inv");
2402-
assert(cast_to_oop(source())->forwardee() == cast_to_oop(destination()), "inv");
2402+
assert(GCForwarding::is_forwarded(cast_to_oop(source())), "inv");
2403+
assert(GCForwarding::forwardee(cast_to_oop(source())) == cast_to_oop(destination()), "inv");
24032404
Copy::aligned_conjoint_words(source(), copy_destination(), words);
24042405
cast_to_oop(copy_destination())->init_mark();
24052406
}

src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "gc/parallel/parMarkBitMap.inline.hpp"
3232
#include "gc/shared/collectedHeap.hpp"
3333
#include "gc/shared/continuationGCSupport.inline.hpp"
34+
#include "gc/shared/gcForwarding.inline.hpp"
3435
#include "oops/access.inline.hpp"
3536
#include "oops/compressedOops.inline.hpp"
3637
#include "oops/klass.hpp"
@@ -79,7 +80,7 @@ inline void PSParallelCompact::adjust_pointer(T* p) {
7980
if (!obj->is_forwarded()) {
8081
return;
8182
}
82-
oop new_obj = obj->forwardee();
83+
oop new_obj = GCForwarding::forwardee(obj);
8384
assert(new_obj != nullptr, "non-null address for live objects");
8485
assert(new_obj != obj, "inv");
8586
assert(ParallelScavengeHeap::heap()->is_in_reserved(new_obj),

src/hotspot/share/gc/serial/serialFullGC.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "gc/shared/classUnloadingContext.hpp"
4444
#include "gc/shared/collectedHeap.inline.hpp"
4545
#include "gc/shared/continuationGCSupport.inline.hpp"
46+
#include "gc/shared/gcForwarding.inline.hpp"
4647
#include "gc/shared/gcHeapSummary.hpp"
4748
#include "gc/shared/gcTimer.hpp"
4849
#include "gc/shared/gcTrace.hpp"
@@ -230,7 +231,7 @@ class Compacter {
230231
static void forward_obj(oop obj, HeapWord* new_addr) {
231232
prefetch_write_scan(obj);
232233
if (cast_from_oop<HeapWord*>(obj) != new_addr) {
233-
obj->forward_to(cast_to_oop(new_addr));
234+
GCForwarding::forward_to(obj, cast_to_oop(new_addr));
234235
} else {
235236
assert(obj->is_gc_marked(), "inv");
236237
// This obj will stay in-place. Fix the markword.
@@ -255,7 +256,7 @@ class Compacter {
255256
prefetch_read_scan(addr);
256257

257258
oop obj = cast_to_oop(addr);
258-
oop new_obj = obj->forwardee();
259+
oop new_obj = GCForwarding::forwardee(obj);
259260
HeapWord* new_addr = cast_from_oop<HeapWord*>(new_obj);
260261
assert(addr != new_addr, "inv");
261262
prefetch_write_copy(new_addr);
@@ -352,13 +353,13 @@ class Compacter {
352353
HeapWord* top = space->top();
353354

354355
// Check if the first obj inside this space is forwarded.
355-
if (!cast_to_oop(cur_addr)->is_forwarded()) {
356+
if (!GCForwarding::is_forwarded(cast_to_oop(cur_addr))) {
356357
// Jump over consecutive (in-place) live-objs-chunk
357358
cur_addr = get_first_dead(i);
358359
}
359360

360361
while (cur_addr < top) {
361-
if (!cast_to_oop(cur_addr)->is_forwarded()) {
362+
if (!GCForwarding::is_forwarded(cast_to_oop(cur_addr))) {
362363
cur_addr = *(HeapWord**) cur_addr;
363364
continue;
364365
}
@@ -624,8 +625,8 @@ template <class T> void SerialFullGC::adjust_pointer(T* p) {
624625
oop obj = CompressedOops::decode_not_null(heap_oop);
625626
assert(Universe::heap()->is_in(obj), "should be in heap");
626627

627-
if (obj->is_forwarded()) {
628-
oop new_obj = obj->forwardee();
628+
if (GCForwarding::is_forwarded(obj)) {
629+
oop new_obj = GCForwarding::forwardee(obj);
629630
assert(is_object_aligned(new_obj), "oop must be aligned");
630631
RawAccess<IS_NOT_NULL>::oop_store(p, new_obj);
631632
}

src/hotspot/share/gc/serial/serialHeap.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "gc/shared/collectedHeap.inline.hpp"
4141
#include "gc/shared/collectorCounters.hpp"
4242
#include "gc/shared/continuationGCSupport.inline.hpp"
43+
#include "gc/shared/gcForwarding.hpp"
4344
#include "gc/shared/gcId.hpp"
4445
#include "gc/shared/gcInitLogger.hpp"
4546
#include "gc/shared/gcLocker.inline.hpp"
@@ -200,6 +201,8 @@ jint SerialHeap::initialize() {
200201

201202
GCInitLogger::print();
202203

204+
GCForwarding::initialize(_reserved);
205+
203206
return JNI_OK;
204207
}
205208

@@ -641,7 +644,6 @@ void SerialHeap::try_collect_at_safepoint(bool full) {
641644
void SerialHeap::collect_at_safepoint(bool full) {
642645
assert(!GCLocker::is_active(), "precondition");
643646
bool clear_soft_refs = must_clear_all_soft_refs();
644-
645647
if (!full) {
646648
bool success = do_young_collection(clear_soft_refs);
647649
if (success) {

0 commit comments

Comments
 (0)