< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahMark.inline.hpp

Print this page
@@ -69,16 +69,19 @@
        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);
-     } else if (klass->is_objArray_klass()) {
+     } else if (klass->is_refArray_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<T>(q, cl, obj, klass, weak);
+     } else if (klass->is_flatArray_klass()) {
+       // Case 3: Flat array instance, all elements are embedded.
+       obj->oop_iterate(cl);
      } else {
-       // Case 3: Primitive array. Do nothing, no oops there. We use the same
+       // Case 4: 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(klass->is_typeArray_klass(), "should be type array");
      }

@@ -87,11 +90,11 @@
      // from final- to strong mark.
      if (task->count_liveness()) {
        count_liveness<GENERATION>(live_data, obj, klass, worker_id);
      }
    } else {
-     // Case 4: Array chunk, has sensible chunk id. Process it.
+     // Case 5: Array chunk, has sensible chunk id. Process it.
      do_chunked_array<T>(q, cl, obj, task->chunk(), task->pow(), weak);
    }
  }
  
  inline void ShenandoahMark::dedup_string(oop obj, StringDedup::Requests* const req) {

@@ -154,12 +157,12 @@
    }
  }
  
  template <class T>
  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);
+   assert(obj->is_refArray(), "expect ref array");
+   refArrayOop array = refArrayOop(obj);
    int len = array->length();
  
    // Mark objArray klass metadata
    if (Devirtualizer::do_metadata(cl)) {
      Devirtualizer::do_klass(cl, klass);

@@ -221,12 +224,12 @@
    }
  }
  
  template <class T>
  void ShenandoahMark::do_chunked_array(ShenandoahObjToScanQueue* q, T* cl, oop obj, int chunk, int pow, bool weak) {
-   assert(obj->is_objArray(), "expect object array");
-   objArrayOop array = objArrayOop(obj);
+   assert(obj->is_refArray(), "expect ref array");
+   refArrayOop array = refArrayOop(obj);
  
    // Split out tasks, as suggested in ShenandoahMarkTask docs. Avoid pushing tasks that
    // are known to start beyond the array.
    while ((1 << pow) > (int)ObjArrayMarkingStride && (chunk*2 < ShenandoahMarkTask::chunk_size())) {
      pow--;
< prev index next >