< prev index next >
src/hotspot/share/gc/z/zMark.cpp
Concurrent class unloading
public:
ZMarkRootsTask(ZMark* mark) :
ZTask("ZMarkRootsTask"),
_mark(mark),
! _roots() {}
virtual void work() {
ZMarkRootOopClosure cl;
_roots.oops_do(&cl);
public:
ZMarkRootsTask(ZMark* mark) :
ZTask("ZMarkRootsTask"),
_mark(mark),
! _roots(ClassUnloading) {}
virtual void work() {
ZMarkRootOopClosure cl;
_roots.oops_do(&cl);
***************
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 >