--- old/src/share/vm/gc/shared/referenceProcessor.hpp 2016-01-24 11:21:54.600753556 +0100 +++ new/src/share/vm/gc/shared/referenceProcessor.hpp 2016-01-24 11:21:54.524754864 +0100 @@ -242,12 +242,12 @@ // Arrays of lists of oops, one per thread (pointers into master array above) DiscoveredList* _discoveredSoftRefs; DiscoveredList* _discoveredWeakRefs; + DiscoveredList* _discoveredEphemerons; DiscoveredList* _discoveredFinalRefs; DiscoveredList* _discoveredPhantomRefs; - DiscoveredList* _discoveredCleanerRefs; - + public: - static int number_of_subclasses_of_ref() { return (REF_CLEANER - REF_OTHER); } + static int number_of_subclasses_of_ref() { return (REF_PHANTOM - REF_OTHER); } uint num_q() { return _num_q; } uint max_num_q() { return _max_num_q; } @@ -271,6 +271,21 @@ VoidClosure* complete_gc, AbstractRefProcTaskExecutor* task_executor); + // Balance ephemerons queues if needed + void balance_discovered_ephemerons(AbstractRefProcTaskExecutor* task_executor); + + // Process ephemerons, phase2 + void process_discovered_ephemerons_ph2(BoolObjectClosure* is_alive, + OopClosure* keep_alive, + VoidClosure* complete_gc, + AbstractRefProcTaskExecutor* task_executor); + + // Process ephemerons, phase3 + void process_discovered_ephemerons_ph3(BoolObjectClosure* is_alive, + OopClosure* keep_alive, + VoidClosure* complete_gc, + AbstractRefProcTaskExecutor* task_executor); + void process_phaseJNI(BoolObjectClosure* is_alive, OopClosure* keep_alive, VoidClosure* complete_gc); @@ -284,18 +299,30 @@ OopClosure* keep_alive, VoidClosure* complete_gc); // Phase2: remove all those references whose referents are - // reachable. - inline void process_phase2(DiscoveredList& refs_list, + // reachable. Return true if any ephemerons were removed. + inline bool process_phase2(DiscoveredList& refs_list, + bool has_ephemerons, BoolObjectClosure* is_alive, OopClosure* keep_alive, VoidClosure* complete_gc) { - if (discovery_is_atomic()) { - // complete_gc is ignored in this case for this phase - pp2_work(refs_list, is_alive, keep_alive); - } else { + if (has_ephemerons) { assert(complete_gc != NULL, "Error"); - pp2_work_concurrent_discovery(refs_list, is_alive, - keep_alive, complete_gc); + if (discovery_is_atomic()) { + return pp2_ephemerons_work(refs_list, is_alive, keep_alive, complete_gc); + } else { + return pp2_ephemerons_work_concurrent_discovery(refs_list, is_alive, + keep_alive, complete_gc); + } + } else { + if (discovery_is_atomic()) { + // complete_gc is ignored in this case for this phase + pp2_work(refs_list, is_alive, keep_alive); + } else { + assert(complete_gc != NULL, "Error"); + pp2_work_concurrent_discovery(refs_list, is_alive, + keep_alive, complete_gc); + } + return false; } } // Work methods in support of process_phase2 @@ -307,10 +334,21 @@ BoolObjectClosure* is_alive, OopClosure* keep_alive, VoidClosure* complete_gc); + bool pp2_ephemerons_work( + DiscoveredList& refs_list, + BoolObjectClosure* is_alive, + OopClosure* keep_alive, + VoidClosure* complete_gc); + bool pp2_ephemerons_work_concurrent_discovery( + DiscoveredList& refs_list, + BoolObjectClosure* is_alive, + OopClosure* keep_alive, + VoidClosure* complete_gc); // Phase3: process the referents by either clearing them // or keeping them alive (and their closure) void process_phase3(DiscoveredList& refs_list, bool clear_referent, + bool has_ephemerons, BoolObjectClosure* is_alive, OopClosure* keep_alive, VoidClosure* complete_gc); @@ -348,7 +386,15 @@ OopClosure* keep_alive, VoidClosure* complete_gc, YieldClosure* yield); - + // The same as above, but specialized for ephemerons and returns true + // if any ephemerons were removed from the list. + bool preclean_discovered_ephemerons_reflist( + DiscoveredList& refs_list, + BoolObjectClosure* is_alive, + OopClosure* keep_alive, + VoidClosure* complete_gc, + YieldClosure* yield); + // round-robin mod _num_q (not: _not_ mode _max_num_q) uint next_id() { uint id = _next_id;