--- old/src/hotspot/share/gc/shared/referenceProcessor.hpp 2018-05-08 09:19:25.977244755 +0200 +++ new/src/hotspot/share/gc/shared/referenceProcessor.hpp 2018-05-08 09:19:25.692235964 +0200 @@ -279,15 +279,15 @@ OopClosure* keep_alive, VoidClosure* complete_gc); - // "Preclean" all the discovered reference lists - // by removing references with strongly reachable referents. + // "Preclean" all the discovered reference lists by removing references that + // are active (e.g. due to the mutator calling enqueue()) or with NULL or + // strongly reachable referents. // The first argument is a predicate on an oop that indicates - // its (strong) reachability and the second is a closure that + // its (strong) reachability and the fourth is a closure that // may be used to incrementalize or abort the precleaning process. // The caller is responsible for taking care of potential // interference with concurrent operations on these lists - // (or predicates involved) by other threads. Currently - // only used by the CMS collector. + // (or predicates involved) by other threads. void preclean_discovered_references(BoolObjectClosure* is_alive, OopClosure* keep_alive, VoidClosure* complete_gc, @@ -298,15 +298,17 @@ // occupying the i / _num_queues slot. const char* list_name(uint i); - // "Preclean" the given discovered reference list - // by removing references with strongly reachable referents. - // Currently used in support of CMS only. - void preclean_discovered_reflist(DiscoveredList& refs_list, +private: + // "Preclean" the given discovered reference list by removing references with + // the attributes mentioned in preclean_discovered_references(). + // Supports both normal and fine grain yielding. + // Returns whether the operation should be aborted. + bool preclean_discovered_reflist(DiscoveredList& refs_list, BoolObjectClosure* is_alive, OopClosure* keep_alive, VoidClosure* complete_gc, YieldClosure* yield); -private: + // round-robin mod _num_queues (not: _not_ mod _max_num_queues) uint next_id() { uint id = _next_id; @@ -323,7 +325,8 @@ void clear_discovered_references(DiscoveredList& refs_list); - void log_reflist_counts(DiscoveredList ref_lists[], uint active_length, size_t total_count) PRODUCT_RETURN; + void log_reflist(const char* prefix, DiscoveredList list[], uint num_active_queues); + void log_reflist_counts(DiscoveredList ref_lists[], uint num_active_queues) PRODUCT_RETURN; // Balances reference queues. void balance_queues(DiscoveredList ref_lists[]);