diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMark.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMark.hpp index 2fbb106f4d7..951779a2ab6 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMark.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMark.hpp @@ -80,13 +80,13 @@ private: inline void do_task(ShenandoahObjToScanQueue* q, T* cl, ShenandoahLiveData* live_data, StringDedup::Requests* const req, ShenandoahMarkTask* task, uint worker_id); template - inline void do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop array, bool weak); + inline void do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop array, Klass* klass, bool weak); template inline void do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop array, int chunk, int pow, bool weak); template - inline void count_liveness(ShenandoahLiveData* live_data, oop obj, uint worker_id); + inline void count_liveness(ShenandoahLiveData* live_data, oop obj, Klass* klass, uint worker_id); template void mark_loop_work(T* cl, ShenandoahLiveData* live_data, uint worker_id, TaskTerminator *t, StringDedup::Requests* const req); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp index 0d42b95164b..78a3a2e1ca9 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp @@ -75,31 +75,32 @@ void ShenandoahMark::do_task(ShenandoahObjToScanQueue* q, T* cl, ShenandoahLiveD cl->set_weak(weak); if (task->is_not_chunked()) { - if (obj->is_instance()) { + Klass* klass = obj->klass(); + if (klass->is_instance_klass()) { // Case 1: Normal oop, process as usual. - if (obj->is_stackChunk()) { + if (klass->is_stack_chunk_instance_klass()) { // Loom doesn't support mixing of weak marking and strong marking of stack chunks. cl->set_weak(false); } obj->oop_iterate(cl); dedup_string(obj, req); - } else if (obj->is_objArray()) { + } else if (klass->is_objArray_klass()) { // Case 2: Object array instance and no chunk is set. Must be the first // time we visit it, start the chunked processing. - do_chunked_array_start(q, cl, obj, weak); + do_chunked_array_start(q, cl, obj, klass, weak); } else { // Case 3: Primitive array. Do nothing, no oops there. We use the same // performance tweak TypeArrayKlass::oop_oop_iterate_impl is using: // We skip iterating over the klass pointer since we know that // Universe::TypeArrayKlass never moves. - assert (obj->is_typeArray(), "should be type array"); + assert(klass->is_typeArray_klass(), "should be type array"); } // Count liveness the last: push the outstanding work to the queues first // Avoid double-counting objects that are visited twice due to upgrade // from final- to strong mark. if (task->count_liveness()) { - count_liveness(live_data, obj, worker_id); + count_liveness(live_data, obj, klass, worker_id); } } else { // Case 4: Array chunk, has sensible chunk id. Process it. @@ -108,11 +109,11 @@ void ShenandoahMark::do_task(ShenandoahObjToScanQueue* q, T* cl, ShenandoahLiveD } template -inline void ShenandoahMark::count_liveness(ShenandoahLiveData* live_data, oop obj, uint worker_id) { +inline void ShenandoahMark::count_liveness(ShenandoahLiveData* live_data, oop obj, Klass* klass, uint worker_id) { const ShenandoahHeap* const heap = ShenandoahHeap::heap(); const size_t region_idx = heap->heap_region_index_containing(obj); ShenandoahHeapRegion* const region = heap->get_region(region_idx); - const size_t size = obj->size(); + const size_t size = obj->size_given_klass(klass); // Age census for objects in the young generation if (GENERATION == YOUNG || (GENERATION == GLOBAL && region->is_young())) { @@ -152,14 +153,14 @@ inline void ShenandoahMark::count_liveness(ShenandoahLiveData* live_data, oop ob } template -inline void ShenandoahMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop obj, bool weak) { +inline void ShenandoahMark::do_chunked_array_start(ShenandoahObjToScanQueue* q, T* cl, oop obj, Klass* klass, bool weak) { assert(obj->is_objArray(), "expect object array"); objArrayOop array = objArrayOop(obj); int len = array->length(); // Mark objArray klass metadata if (Devirtualizer::do_metadata(cl)) { - Devirtualizer::do_klass(cl, array->klass()); + Devirtualizer::do_klass(cl, klass); } if (len <= (int) ObjArrayMarkingStride*2) {