< prev index next >

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

Concurrent class unloading

*** 124,134 **** public: ZMarkRootsTask(ZMark* mark) : ZTask("ZMarkRootsTask"), _mark(mark), ! _roots() {} virtual void work() { ZMarkRootOopClosure cl; _roots.oops_do(&cl); --- 124,134 ---- public: ZMarkRootsTask(ZMark* mark) : ZTask("ZMarkRootsTask"), _mark(mark), ! _roots(ClassUnloading) {} virtual void work() { ZMarkRootOopClosure cl; _roots.oops_do(&cl); ***************
*** 251,261 **** --- 251,283 ---- 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 >