< prev index next >

src/hotspot/share/gc/z/zMark.cpp

Concurrent class unloading
 
 public:
   ZMarkRootsTask(ZMark* mark) :
       ZTask("ZMarkRootsTask"),
       _mark(mark),
-      _roots() {}
+      _roots(ClassUnloading) {}
 
   virtual void work() {
     ZMarkRootOopClosure cl;
     _roots.oops_do(&cl);
 

@@ -251,11 +251,33 const size_t size = entry.partial_array_length() * oopSize; follow_array(addr, size, finalizable); } +void ZMark::follow_klass(Klass* klass, bool finalizable) { + ClassLoaderData* cld = klass->class_loader_data(); + if (!cld->claim(finalizable)) { + return; + } + + oop holder = cld->holder_no_keepalive(); + if (holder == NULL) { + return; + } + + if (finalizable) { + ZHeap::heap()->mark_object<true, false>(ZOop::to_address(holder)); + } else { + ZHeap::heap()->mark_object<false, false>(ZOop::to_address(holder)); + } +} + void ZMark::follow_array_object(objArrayOop obj, bool finalizable) { + if (ClassUnloading) { + follow_klass(obj->klass(), finalizable); + } + const uintptr_t addr = (uintptr_t)obj->base(); const size_t size = (size_t)obj->length() * oopSize; follow_array(addr, size, finalizable); }
< prev index next >