< prev index next >
src/hotspot/share/gc/z/zRootsIterator.cpp
Print this page
rev 50539 : [mq]: 8204613-stringtable-unclean-fix
@@ -305,14 +305,16 @@
_symbol_table(this),
_string_table(this) {
assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
ZStatTimer timer(ZSubPhasePauseWeakRootsSetup);
SymbolTable::clear_parallel_claimed_index();
+ StringTable::reset_dead_counter();
}
ZWeakRootsIterator::~ZWeakRootsIterator() {
ZStatTimer timer(ZSubPhasePauseWeakRootsTeardown);
+ StringTable::finish_dead_counter();
}
void ZWeakRootsIterator::do_vm_weak_handles(BoolObjectClosure* is_alive, OopClosure* cl) {
ZStatTimer timer(ZSubPhasePauseWeakRootsVMWeakHandles);
_vm_weak_handles_iter.weak_oops_do(is_alive, cl);
@@ -339,13 +341,38 @@
ZStatTimer timer(ZSubPhasePauseWeakRootsSymbolTable);
int dummy;
SymbolTable::possibly_parallel_unlink(&dummy, &dummy);
}
+class ZStringTableDeadCounterBoolObjectClosure : public BoolObjectClosure {
+private:
+ BoolObjectClosure* const _cl;
+ size_t _ndead;
+
+public:
+ ZStringTableDeadCounterBoolObjectClosure(BoolObjectClosure* cl) :
+ _cl(cl),
+ _ndead(0) {}
+
+ ~ZStringTableDeadCounterBoolObjectClosure() {
+ StringTable::inc_dead_counter(_ndead);
+ }
+
+ virtual bool do_object_b(oop obj) {
+ if (_cl->do_object_b(obj)) {
+ return true;
+ }
+
+ _ndead++;
+ return false;
+ }
+};
+
void ZWeakRootsIterator::do_string_table(BoolObjectClosure* is_alive, OopClosure* cl) {
ZStatTimer timer(ZSubPhasePauseWeakRootsStringTable);
- _string_table_iter.weak_oops_do(is_alive, cl);
+ ZStringTableDeadCounterBoolObjectClosure counter_is_alive(is_alive);
+ _string_table_iter.weak_oops_do(&counter_is_alive, cl);
}
void ZWeakRootsIterator::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* cl) {
ZStatTimer timer(ZSubPhasePauseWeakRoots);
if (ZSymbolTableUnloading) {
@@ -375,11 +402,17 @@
_vm_weak_handles_iter(SystemDictionary::vm_weak_oop_storage()),
_jni_weak_handles_iter(JNIHandles::weak_global_handles()),
_string_table_iter(StringTable::weak_storage()),
_vm_weak_handles(this),
_jni_weak_handles(this),
- _string_table(this) {}
+ _string_table(this) {
+ StringTable::reset_dead_counter();
+}
+
+ZConcurrentWeakRootsIterator::~ZConcurrentWeakRootsIterator() {
+ StringTable::finish_dead_counter();
+}
void ZConcurrentWeakRootsIterator::do_vm_weak_handles(OopClosure* cl) {
ZStatTimer timer(ZSubPhaseConcurrentWeakRootsVMWeakHandles);
_vm_weak_handles_iter.oops_do(cl);
}
@@ -387,13 +420,40 @@
void ZConcurrentWeakRootsIterator::do_jni_weak_handles(OopClosure* cl) {
ZStatTimer timer(ZSubPhaseConcurrentWeakRootsJNIWeakHandles);
_jni_weak_handles_iter.oops_do(cl);
}
+class ZStringTableDeadCounterOopClosure : public OopClosure {
+private:
+ OopClosure* const _cl;
+ size_t _ndead;
+
+public:
+ ZStringTableDeadCounterOopClosure(OopClosure* cl) :
+ _cl(cl),
+ _ndead(0) {}
+
+ ~ZStringTableDeadCounterOopClosure() {
+ StringTable::inc_dead_counter(_ndead);
+ }
+
+ virtual void do_oop(oop* p) {
+ _cl->do_oop(p);
+ if (*p == NULL) {
+ _ndead++;
+ }
+ }
+
+ virtual void do_oop(narrowOop* p) {
+ ShouldNotReachHere();
+ }
+};
+
void ZConcurrentWeakRootsIterator::do_string_table(OopClosure* cl) {
ZStatTimer timer(ZSubPhaseConcurrentWeakRootsStringTable);
- _string_table_iter.oops_do(cl);
+ ZStringTableDeadCounterOopClosure counter_cl(cl);
+ _string_table_iter.oops_do(&counter_cl);
}
void ZConcurrentWeakRootsIterator::oops_do(OopClosure* cl) {
ZStatTimer timer(ZSubPhaseConcurrentWeakRoots);
if (ZWeakRoots) {
< prev index next >